Development Tip

HotSpot JVM에서 삭제되는 압축 문자열 지원?

yourdevel 2020. 12. 12. 12:35
반응형

HotSpot JVM에서 삭제되는 압축 문자열 지원?


이 Oracle 페이지 Java HotSpot VM Options 에서 -XX:+UseCompressedStrings사용 가능한 것으로 표시 되며 기본적으로 켜져 있습니다. 그러나 Java 6 업데이트 29에서는 기본적으로 꺼져 있으며 Java 7 업데이트 2에서는 경고를보고합니다.

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option UseCompressedStrings; support was removed in 7.0

이 옵션을 제거하는 방법을 아는 사람이 있습니까?


자바에서 거대한 file.txt의 줄 정렬

를 사용 -mx2g하면이 예제는 옵션이 켜진 상태에서 4.541 초, Java 6 업데이트 29에서 꺼진 상태에서 5.206 초가 걸렸습니다. 성능에 영향을 미치는지 확인하기 어렵습니다.

참고 : Java 7 업데이트 2에는 2.0G가 필요하지만 압축 된 문자열이없는 Java 6 업데이트 29에는 1.8GB가 필요하고 압축 된 문자열에는 1.0GB 만 필요합니다.


원래이 옵션은 SPECjBB 성능을 향상시키기 위해 추가되었습니다. 이점은 프로세서와 DRAM 간의 메모리 대역폭 요구 사항이 감소했기 때문입니다. byte []에 바이트를로드하고 저장하는 것은 char []에있는 문자에 비해 대역폭의 1/2을 소비합니다.

그러나 이것은 대가가 따릅니다. 코드는 내부 배열이 byte []인지 char []인지 확인해야합니다. CPU 시간이 걸리며 워크로드가 메모리 대역폭에 제한 되지 않으면 성능 회귀가 발생할 수 있습니다. 추가 된 복잡성으로 인해 코드 유지 관리 비용도 있습니다.

상당한 이득 (아마도 SPECjBB 제외)을 보여주는 프로덕션과 같은 워크로드가 충분하지 않았기 때문에 옵션이 제거되었습니다.

여기에는 또 다른 각도가 있습니다. 이 옵션은 힙 사용량을 줄입니다. 해당 문자열의 경우 해당 문자열의 메모리 사용량을 1/2로 줄입니다. 이 각도는 옵션 제거시 고려되지 않았습니다. 메모리 용량이 제한된 워크로드 (예 : 제한된 힙 공간으로 실행해야하고 GC에 많은 시간이 소요됨)의 경우이 옵션이 유용 할 수 있습니다.

충분한 메모리의 경우 용량이 제한된 생산과 같은 워크로드에 옵션의 포함하고 정당화하기 위해 찾을 수 있습니다 어쩌면 옵션이 가져됩니다 다시.

2013 년 3 월 20 일 편집 : 평균 서버 힙 덤프는 문자열 공간의 25 %를 사용합니다. 대부분의 문자열은 압축 가능합니다. 옵션이 다시 도입되면이 공간의 절반을 절약 할 수 있습니다 (예 : ~ 12 %)!

2016 년 3 월 10 일 편집 : 압축 된 문자열과 유사한 기능이 JDK 9 JEP 254 에서 다시 제공됩니다 .


관심있는 사람들을 위해 추가하십시오 ...

java.lang.CharSequence의 인터페이스 ( java.lang.String구현)는 UTF-16 문자열보다 더욱 컴팩트 표현을 허용한다.

많은 문자열을 조작하는 앱 CharSequencejava.lang.String, 또는보다 간결한 표현 과 함께 작동 하도록 허용하도록 작성되어야합니다 .

8 비트 (UTF-8) 또는 5, 6 또는 7 비트로 인코딩되거나 압축 된 문자열도 CharSequence.

CharSequences는 또한 조작하기에 훨씬 더 효율적일 수 있습니다. 하위 시퀀스는 예를 들어 복사하는 대신 원본 콘텐츠에 대한 뷰 (포인터)로 정의 할 수 있습니다.

예를 들어, Concurrent-trees 에서 셰익스피어 연극 10 개의 접미사 트리는 기반 노드를 사용하는 2GB의 RAM 이 필요 하며 char [] 또는 문자열 기반 노드를 사용하는 경우 249GB 의 RAM 이 필요합니다 .CharSequence


찬성표가 있었기 때문에 나는 명백한 것을 놓치고 있지 않았기 때문에 버그로 기록했습니다 (최소한 문서에서 누락)

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7129417

(이틀 후에 표시되어야 함)


Java 9 는 Java 6보다 두 배 빠른 속도로 Java 에서 거대한 file.txt정렬 라인을 실행하며 -XX:+CompactStrings기본적으로 활성화 된 메모리 1G 만 필요합니다 . 또한 Java 6에서는 압축 된 문자열이 7 비트 ASCII 문자에서만 작동하는 반면 Java 9에서는 Latin1 (ISO-8859-1)을 지원합니다. charAt(idx)그래도 일부 작업은 약간 느릴 수 있습니다. 새로운 디자인을 통해 향후 다른 인코딩도 지원할 수 있습니다.

이에 대한 뉴스 레터를 The Java Specialists 'Newsletter 에 썼습니다 .


OpenJDK 7 (1.7.0_147-icedtea, Ubuntu 11.10)에서 JVM은 단순히 실패하고

인식 할 수없는 VM 옵션 'UseCompressedStrings'

JAVA_OPTS(또는 명령 줄) 포함 -XX:+UseCompressedStrings.

오라클이 실제로 옵션을 제거한 것 같습니다.

참고 URL : https://stackoverflow.com/questions/8833385/support-for-compressed-strings-being-dropped-in-hotspot-jvm

반응형