UseCompressedOops JVM 플래그의 기능은 무엇이며 언제 사용해야합니까?


85

HotSpot JVM 플래그 -XX:+UseCompressedOops는 무엇을하며 언제 사용해야합니까? 64 비트 Java 인스턴스에서 사용할 때 (사용하지 않는 경우와 비교) 어떤 종류의 성능 및 메모리 사용 차이를 볼 수 있습니까?


1
64 비트 포인터를 압축합니다. 포인터 크기 증가로 인한 메모리 팽창 감소, GC에 소요되는 시간 감소, 성능 저하 등을 볼 수 있습니다. jdk1.6.0_22는 기본적으로이 플래그를 해제 한 마지막 Sun JVM입니다.
sjr

답변:


86

작년에 대부분의 HotSpot JVM은 기본적으로 켜져 있습니다. 이 옵션을 사용하면 64 비트 JVM에서 참조가 32 비트이고 32GB에 가까운 힙에 액세스 할 수 있습니다. (32 비트 이상의 포인터가 가능) (힙 메모리를 거의 무제한으로 사용할 수 있습니다). 이것은 상당한 양의 메모리를 절약하고 잠재적으로 성능을 향상시킬 수 있습니다.

이 옵션을 사용하려면 버그, 이전에 활성화되지 않은 이유와 같은 합당한 이유가있을 수 있으므로 기본적으로 활성화 된 버전으로 업데이트하는 것이 좋습니다. Java 6 업데이트 23 또는 Java 7 업데이트 5를 사용해보십시오.

간단히 말해, 전원을 켜지 말고 기본적으로 켜져있는 버전을 사용하십시오.


최신 정보:

Java 8에는를 설정할 수있는 옵션이 -XX:ObjectAlignmentInBytes=있으며 실제로 힙 크기를 64GB 로 설정하면 -XX:ObjectAlignmentInBytes=1632 비트 참조를 사용 하고 계속 사용합니다.


이 기사를 읽었습니다. community.oracle.com/message/10019916 이 플래그는 기본적으로 활성화되어 있어도 항상 수동으로 사용해야 함을 나타냅니다. 이견있는 사람?
vanval 2014

1
@vanval 사용하는 경우 권장됩니다 JE cache . 어떤 이유로 압축을 사용하는지 여부를 확인할 수 없기 때문입니다. 이 btw를 알려줄 수있는 몇 가지 방법을 생각할 수 있습니다. JVM이 활성화되지 않은 경우 실패하도록하려는 경우가 아니면 명령 줄 IMHO에서 지정할 필요가 없습니다. 예를 들어 Java 8에 64GB 힙이 있습니다.
Peter Lawrey 2014

3
7GB xms 및 xmx로 Win8 x64 i7-4702MQ JDK 8 u40에서 몇 가지 테스트를 실행했습니다. 7GB 중 5.4GB는 Access db에서로드 된 큰 트리에서 사용됩니다. 내 요점은 -XX : + UseCompressedOops 플래그를 수동으로 지정하면 성능 (큰 트리 생성시)이 20 % 감소하고 GC 일시 중지 (기본 GC 사용)가 1 회 더 늘어납니다 (3-4). 성능 저하 또는 GC 일시 중지 증가로 간주합니다. 어느 쪽이든 20 % 더 느 렸습니다.
zmirc

1
각 응용 프로그램에는 자체 메모리 및 사용 프로필이 있습니다. 우리의 경우 32 비트 jvm에서 오는 데스크톱 앱인 + UseCompressedOops 플래그는 클라이언트의 기존 4GB 시스템에 맞도록 메모리 사용량을 낮게 유지하고 32 비트 jvm에 비해 30 %의 성능을 향상 시켰기 때문에 하루를 절약했습니다.
Alex Byrth 2016
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.