자바 성능 튜닝 이야기 String

자바 성능 튜닝 이야기 String

2022, May 14    

알아보게 된 이유.

자바 성능 튜닝 이야기라는 책을 읽으며 자바의 성능을 올릴 수 있는 이야기들을 정리해보고 자 한다.

String

String이 GC에 영향을 주는 건 확실하다.

StringBuffer 클래스랑 StringBuilder 클래스의 다른점은 StringBuffer클래스는 스레드에 안전하게 설계되어있으므로, 여러 개의 스레드에서 하나의 StringBuffer 객체를 처리해도 전혀 문제되지 않는다. 하지만 StringBuilder는 단일 스레드에서의 안전성만 보장한다. 그렇기 때문에 여러개의 스레드에서 하나의 StringBuilder 객체를 처리하면 문제가 발생한다.

final String aValue = "abcde";
for(int outLoop = 0; outLoop<10; outLoop++){
    String a = new String();
    StringBuffer b = new StringBuffer();
    StrinfBuilder c = new StringBuilder();
    
    for(int loop = 0 ; i < loop < 10000; loop++){
        a+=aValue;
    }
    for(int loop = 0 ; i < loop < 10000; loop++){
        b.append(aValue);
    }
    for(int loop = 0 ; i < loop < 10000; loop++){
        c.append(aValue);
    }

10000회 반복하여 문자열을 더하고 이러한 작업을 10회 반복한다. 그리고 이 화면을 10회 반복 호출한다.

String = 95초 메모리 사용량 96Gb

StringBuffer = 0.24초 메모리 사용량 28Mb

StringBuilder = 0.17초 메모리 사용량 28Mb

이러한 이유가 발생하는 이유는 a+=Value 를 하게 되면 새로운 String 클래스의 객체가 만들어지고 이전에 a 객체는 쓰레기 값이 되어 GC 대상이 되어버린다.

하지만 StringBuffer나 StringBuilder는 String과 다르게 새로운 객체를 생성하지 않고, 기존에 있는 객체의 크기를 증가 시키면서 값을 더한다. String은 짧은 문자열을 더할 경우 사용한다. StringBuffer는 개발 중인 시스템의 부분이 스레드에 안전한지 모를 경우 사용하면 좋다. StringBuilder는 스레드에 안전한지 여부와 전혀 관계 없는 프로그램을 개발할 때 사용하면 좋다. JDK 5.0 이상을 사용하면 컴파일러에서 자동으로 StringBuilder로 변환하여 준다.