new String("Something")의 문제점
새로운 String 인스턴스를 만든다
이 문장이 수백 번 호출되면 수백 개의 인스턴스를 생성한다
String s = "Something";
위 방식은 하나의 String 인스턴스를 사용한다
String.matches의 문제점
static boolean isRomanNumeral(String s) {
return s.matches("정규표한식");
}
String.matches 내부에서 Pattern 인스턴스를 생성 후 바로 버림
-> Pattern은 생성 비용이 높음
해당 Pattern 인스턴스를 재활용한다면?
public class RomanNumerals {
private static final Pattern ROMAN = Pattern.compile(
"정규표현식"
);
static boolean isRomanNumeral(String s) {
return ROMAN.matcher(s).matches();
}
}
위 방식은 6.5배의 성능 개선이 있었다고 함 (출처: 이펙티브 자바)
오토 박싱
기본 타입과 boxing 타입을 섞어 쓸 때 자동으로 상호 변환해줌
성능상 문제 발생 상황
private static long sum() {
Long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++)
sum += i;
return sum;
}
위 상황에서는 불필요한 Long 인스턴스가 231개 만들어짐
Long을 long으로 바꿀 시 6.3초 -> 0.59초로 빨라짐 (출처: 이펙티브 자바)
박싱된 기본 타입보다 기본 타입을 사용하고, 의도치 않은 오토 박싱이 숨어들지 않도록 해야함
주의! : "객체 생성은 비싸니 피해야 한다"가 아님
- 객체 풀은 코드를 햇갈리게 만들고 메모리 사용량을 늘리고 성능을 떨어뜨리므로 꼭 필요할 때 사용할 것
- JVM의 GC의 최적화가 잘 되어있음
예외 케이스: 생성 비용이 비싼 DB connection pool