UseCompressedOops JVM bayrağı ne işe yarar ve ne zaman kullanmalıyım?


85

HotSpot JVM bayrağı -XX:+UseCompressedOopsne işe yarar ve ne zaman kullanmalıyım? 64 bit Java örneğinde kullanırken (kullanmama ile karşılaştırıldığında) ne tür performans ve bellek kullanım farklılıkları göreceğim?


1
64 bitlik işaretçileri sıkıştırır. Artan işaretçi boyutundan kaynaklanan bellek şişkinliğinin azaldığını, GC'de daha az zaman harcandığını, belki de performansta küçük bir düşüş göreceksiniz. jdk1.6.0_22, bu bayrağı varsayılan olarak devre dışı bırakan son Sun JVM idi.
sjr

Yanıtlar:


87

Geçen yılki çoğu HotSpot JVM, varsayılan olarak etkinleştirdi. Bu seçenek, referansların 64 bitlik bir JVM'de 32 bit olmasına ve 32 GB'ye yakın yığın erişimine izin verir. (32 bitlik işaretçilerden daha fazlasını yapabilir) (Sınırsız sayıda yığın belleğe de sahip olabilirsiniz). Bu, önemli miktarda bellek tasarrufu sağlayabilir ve performansı potansiyel olarak artırabilir.

Bu seçeneği kullanmak istiyorsanız, daha önce neden etkinleştirilmemiş olması gibi hatalar gibi iyi bir neden olabileceğinden, varsayılan olarak açık olan bir sürüme güncellemenizi öneririm. Java 6 güncelleme 23 veya Java 7 güncelleme 5'i deneyin.

Kısacası, açmayın, varsayılan olarak açık olan bir sürümü kullanın.


Güncelleme:

Java 8'de ayarlama seçeneğiniz vardır -XX:ObjectAlignmentInBytes=ve aslında yığın boyutunu 64 GB'a ayarlarsanız, -XX:ObjectAlignmentInBytes=1632 bitlik referansları kullanır ve yine de kullanır.


Bu makaleyi okudum: community.oracle.com/message/10019916 , varsayılan olarak etkin olsa bile bu bayrağı her zaman manuel olarak kullanmamız gerektiğini belirtir. Düşüncesi olan var mı?
vanval

1
@vanval Kullanıyorsanız tavsiye edilir JE cache Bunun nedeni, herhangi bir nedenle kompres kullanıp kullanmadığınızı çözememesidir . Size bu btw'yi anlatabilecek birkaç yöntem düşünebilirim. JVM'nin etkin değilse başarısız olmasını istemiyorsanız, IMHO komut satırında belirtmeniz gerekmez. örneğin Java 8'de 64 GB'lık bir yığınınız var.
Peter Lawrey

3
7 GB xms ve xmx ile Win8 x64 i7-4702MQ JDK 8 u40 üzerinde bazı testler yaptım, 7 GB dışında, 5,4 GB bir Access db'den yüklenen büyük bir ağaç tarafından kullanılıyor. Demek istediğim: -XX: + UseCompressedOops bayrağının manuel olarak belirtilmesi performansta% 20 düşüşe (büyük ağaç oluşturulurken) ve 1 daha uzun GC duraklamasına (varsayılan GC ile) (3'ten 4'e) yol açar. Bunu ya performansta bir azalma ya da GC duraklamasında bir artış olarak alırsınız. Her iki durumda da% 20 daha yavaştı.
zmirc

1
Her uygulamanın kendi hafızası ve kullanım profili vardır. Bizim durumumuzda, 32 bit jvm'den gelen bir masaüstü uygulaması olan + UseCompressedOops bayrağı, bellek kullanımını istemcinin eski 4gb makinesine sığacak kadar düşük tuttuğu ve 32 bit jvm ile karşılaştırıldığında performansı% 30 artırdığı için günü kurtarıyor.
Alex Byrth
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.