728x90
개요
for문 안에서 String 문자열을 합칠(+) 경우 new String("")객체로 생성되어 성능상 좋지 않다는 글을 읽고 테스트 했다.
테스트는 ubuntu에서 JDK 11버전, javap를 통해 확인했다.
java로 String을 만들고 for문 전, 내부, 후 3가지를 확인해보기 위해 다음과 같이 작성했다.
public class Sample{
public String gcTest(String data){
String result = "start";
result += "Test";
System.out.println("for문 시작하기 전");
for( int i = 0 ; i < 10 ; i++ ){
result += "test";
System.out.println("for문 안에");
}
System.out.println("for문 끝난 후");
return result+"end";
}
}
- javac Sample.java 명령어를 통해 class 파일을 생성하고
- javap -c Sample.class 명령어를 통해 확인했다.
분석 결과
결과는 다음과 같다.
객체를 생성하지 않고 makeconcat이라는 메소드를 사용한다.
이것은 무엇일까?
확인결과 JDK 8 버전 이전에는 new 를 통해 새로운 객체를 생성해서 더했다고 한다.
그렇기 때문에 "String을 for문 안에서 사용하면 성능에 좋지 않다" 이야기가 나왔을 것이라 추정된다.
내가 테스트한 JDK는 11 버전이기 때문에 JDK 9 버전 이후 만들어진 StringConcatFactory 클래스를 통해 makeconcat이 사용되었다.
java API를 통해 번역 결과 다음과 같다.
"알려진 유형의 알려진 수의 인수를 효율적으로 연결하는 데 사용할 수 있는 최적화된 문자열 연결 방법의 생성을 용이하게 합니다. 가능하면 형식 적응 및 인수의 부분 평가 후에 가능합니다. 일반적으로 Java 프로그래밍 언어 의 문자열 연결 기능 을 지원 하기 위해 invokedynamic호출 사이트 의 부트스트랩 방법으로 사용됩니다 ."
StringBuilder와 String의 메모리 사용량 차이를 계산해보진 않았지만 개선 되었다는 것을 알 수 있었다.
728x90
'Software Backend > Java & Spring' 카테고리의 다른 글
Spring Framework IoC, AOP, PSA (0) | 2021.08.29 |
---|---|
자바 기초 다지기 - 4 (내부 클래스, 어노테이션, 자바) (0) | 2021.08.29 |
자바 new, StringBuilder 메모리 사용량 테스트 (0) | 2021.08.25 |
자바 기초 다지기 - 3 (API, Object, 추상, final, Enum, 예외, String) (0) | 2021.08.23 |
에러, error Type referred to is not an annotation type: LogExecutionTime (0) | 2021.08.22 |