8월 19일 Oracle은 JDK 8u20을 출시했습니다. JDK 8u20에는 Java 컴파일러 업데이트, 런타임 시 API를 통한 MinHeapFreeRatio 및 MaxHeapFreeRatio 매개변수 수정 지원, 새로운 GC 튜닝 가이드 문서 등 많은 새로운 기능이 포함되어 있습니다. 그러나 많은 새로운 기능 중에서 가장 기대되는 기능은 문자열 중복 제거입니다. 메모리 사용량을 줄이는 방법은 항상 영원한 주제였습니다. Java 애플리케이션에서는 String 객체가 애플리케이션 메모리의 30%를 차지하는 경우가 많습니다. 이는 Java에서 가장 일반적으로 사용되는 객체 중 하나입니다. 새로운 문자열 중복 제거 기능은 애플리케이션에서 문자열 개체의 메모리 공간을 줄이는 데 도움이 될 수 있습니다. 현재 이 기능은 G1 가비지 수집기에만 사용할 수 있으며 기본적으로 활성화되어 있지 않습니다.
Fabian Lange는 문자열 중복 제거가 구현되는 방법을 설명합니다.
다음과 같이 코드 코드를 복사합니다.
가비지 수집기는 액세스될 때 String 객체의 문자 배열을 표시하고 String의 해시 값과 약한 참조를 배열에 저장합니다. 가비지 수집기가 동일한 해시 값을 가진 다른 String 개체를 찾으면 두 개체를 문자별로 비교합니다. 정확하게 일치하면 한 문자열이 다른 문자열의 문자 배열을 가리키도록 수정됩니다. 첫 번째 문자 배열은 더 이상 참조되지 않으므로 재활용할 수 있습니다. 가비지 수집기는 전체 작업 비용을 줄이려고 노력합니다. 예를 들어 문자열 개체를 검색했는데 중복 항목이 발견되지 않으면 다음 기간에 다시 확인되지 않습니다.
다음으로 Fabian Lange는 코드를 통한 문자열 중복 제거의 마법 같은 효과를 설명했습니다. 먼저 -Xmx256m -XX:+UseG1GC 매개변수와 함께 Java 8 업데이트 20을 사용하여 다음 코드를 실행합니다.
다음과 같이 코드 코드를 복사합니다.
공개 클래스 LotsOfStrings {
private static final LinkedList<String> LOTS_OF_STRINGS = new LinkedList<>();
public static void main(String[] args)에서 예외가 발생합니다.
정수 반복 = 0;
동안 (참) {
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 1000; j++) {
LOTS_OF_STRINGS.add(new String("String " + j));
}
}
반복++;
System.out.println("생존 반복: " + 반복);
Thread.sleep(100);
}
}
}
30회 루프 후에 OutOfMemoryError 예외로 인해 코드 실행이 종료됩니다. -XX:+UseStringDeduplication -XX:+PrintStringDeduplicationStatistics 매개변수를 사용하여 문자열 중복 제거 기능을 활성화한 후 프로그램을 더 오랫동안 실행할 수 있습니다. JVM 로그를 통해 전체 중복 제거 프로세스의 세부 사항에 대해 자세히 알아볼 수도 있습니다. 독자들이 직접 테스트해 보도록 요청합니다.
마지막으로 Fabian Lange는 문자열 중복 제거와 문자열 상주 간의 차이점도 설명했습니다. 단, 문자열 상주에서는 전체 String 인스턴스를 재사용하는 반면 문자열 중복 제거는 String의 문자 배열만 대상으로 한다는 점이 다릅니다.
(전체 텍스트 끝)