티스토리 뷰
String 클래스는 GC에 영향을 준다. GC란 자바에서 사용하는 한정된 메모리 공간이 꽉 찼을 경우
더 이상 필요없는 객체를 제거하는 작업을 말한다.
String 타입을 결합할 때에는 +연산으로 결합하는 것이 아니라,
StringBuilder나 StringBuffer 클래스를 사용해야 한다.
예를 들어보자면
String str = "";
for(int i=0; i<4000; i++){
str += "select *";
str += "from ";
str += "table where";
str += "id=";
str += "'asd'";
}
와
StringBuilder sb = new StringBuilder();
for(int i=0; i<4000; i++){
sb.append("select *");
sb.append("from ");
sb.append("table where");
sb.append("id=");
sb.append("'asd'");
}
이 두 코드를 비교해보면 첫 번째로 일반 String 결합은 평균적으로 720 밀리초가 나왔고,
두 번째 StringBuilder 클래스로 한 결합은 평균 1.4 밀리초가 나왔다.
약 500배나 되는 엄청난 차이다.
프로파일링 툴을 사용하지 않아 메모리 사용량은 측정하지 못했지만, 메모리 사용량의 차이도
상당히 크다고 한다. 그 이유로는 String객체에 +연산을 하게 되면 두 객체를 결합한 새 객체를
메모리에 생성하게 된다. 그 연산이 누적되면 연산에 사용됬던, 이제는 쓸모없는 String 객체들이 많이
생겨나게 되고, 이는 GC에 영향을 미치게 되는 것이다.
그러나 StringBuffer나, StringBuilder는 새로운 객체를 생성하지 않고, 객체의 크기를 늘려가며
작업하기 때문에 속도에 이점이 있다. 즉 객체의 결합이 아닌 문자열의 끝에 다음 문자열의
메모리 주소를 줌으로써 속도를 높이는 것이다.
StringBuilder와 StringBuffer는 메소드명까지 같다.
그렇다면 두개의 차이점은 무엇일까?
StringBuffer는 스레드에 안전하게 설계되어 있다.
즉 여러 스레드가 하나의 StringBuffer의 객체를 작업할 수 있다.
그리고 StringBuilder는 스레드에 안전하지 않으므로 단일 스레드로 작업해야한다.
정리하자면
1. String 클래스의 +연산은 짧은 문자열을 더할 때에만 사용한다.
2. StringBuffer 클래스는 스레드 작업을 하거나, static 문자열을 변경하거나,
singleton 클래스에 선언된 문자열에서 작업할 때 사용한다.
3. StringBuilder 클새스는 단일 스레드로 작업할 때나, 메소드의 지역변수를 상대로 작업한다.
4. JDK 5.0 이상부터는 String의 +연산을 컴파일러가 자동으로 StringBuilder 연산으로 바꿔주지만,
반복문 안에서의 +연산은 여전히 일반 +연산으로 수행하므로 가급적 StringBuffer나 StringBuilder를
사용한다.
'JAVA' 카테고리의 다른 글
[자바 성능튜닝] 조건문과 반복문 (0) | 2015.04.13 |
---|---|
[자바 성능튜닝] 사용할 Collection(자료구조)을 선택할 때 고려할 점 (0) | 2015.04.13 |
[실험] 병렬연산과 직렬연산의 속도차이 (0) | 2015.04.13 |
자바 성능측정 라이브러리 (0) | 2015.04.13 |
성능측정용 메소드 : System.nanoTime() 메소드 (0) | 2015.04.13 |
- Total
- Today
- Yesterday
- 리액트
- gitlab
- 알람
- opensource
- 메모리
- 자바 성능
- RAMDA
- rambda
- 시간
- Clojure
- 날짜
- 성능개선
- Swift 2.0
- Java
- react
- Docker
- 프로세서
- 컴퓨터 시간
- 성능
- 코어
- Java8
- 자바
- json
- 퍼포먼스
- javascript
- 람다
- Stream
- Jackson
- 자료구조
- 클로저
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |