UseCompressedOops JVMフラグは何をし、いつ使用する必要がありますか?


85

HotSpot JVMフラグ-XX:+UseCompressedOopsは何をし、いつ使用する必要がありますか?64ビットJavaインスタンスで使用すると(使用しない場合と比較して)、どのようなパフォーマンスとメモリ使用量の違いが見られますか?


1
64ビットポインタを圧縮します。ポインタサイズの増加、GCに費やす時間の短縮、パフォーマンスのわずかな低下により、メモリの膨張が減少することがわかります。jdk1.6.0_22は、デフォルトでこのフラグをオフにした最後のSunJVMでした。
sjr 2012年

回答:


86

昨年のほとんどのHotSpotJVMは、デフォルトでオンになっています。このオプションを使用すると、64ビットJVMで参照を32ビットにし、32GBに近いヒープにアクセスできます。(32ビット以上のポインタが可能)(ほぼ無制限のオフヒープメモリを持つこともできます)。これにより、メモリを大幅に節約し、パフォーマンスを向上させることができます。

このオプションを使用する場合は、バグなどの正当な理由があり、以前に有効にされなかった理由がある可能性があるため、デフォルトでオンになっているバージョンに更新することをお勧めします。Java6アップデート23またはJava7アップデート5をお試しください。

つまり、オンにしないで、デフォルトでオンになっているバージョンを使用してください。


更新:

Java 8では、を設定するオプションがあります。-XX:ObjectAlignmentInBytes=実際、ヒープサイズを64 GBに設定すると、-XX:ObjectAlignmentInBytes=1632ビット参照が使用されます。


私はこの記事を読みました:community.oracle.com/message/10019916 このフラグは、デフォルトで有効になっている場合でも、常に手動で使用する必要があると述べています。何かご意見は?
vanval 2014年

1
@vanvalJE cache これは、使用している場合に推奨されます。これは、何らかの理由でcompresssoopsを使用しているかどうかがわからないためです。私はあなたにこのところで言うことができるいくつかの方法を考えることができます。有効になっていない場合にJVMを失敗させたくない場合を除いて、コマンドラインIMHOで指定する必要はありません。例えば、あなたは、Java 8の64ギガバイトのヒープ持って
ピーターLawrey

3
Win8 x64 i7-4702MQ JDK 8u40で7GB xmsおよびxmxを使用していくつかのテストを実行しました。7GBのうち、5.4GBはAccessデータベースからロードされた大きなツリーによって使用されます。私のポイントは、-XX:+ UseCompressedOopsフラグを手動で指定すると、パフォーマンスが20%低下し(大きなツリーを生成する場合)、さらに1つ(3から4)長いGC一時停止(デフォルトのGCを使用)になります。これは、パフォーマンスの低下またはGC一時停止の増加と見なされます。いずれにせよ、それは20%遅くなりました。
zmirc 2015年

1
各アプリケーションには、独自のメモリと使用状況プロファイルがあります。私たちの場合、32ビットjvmからのデスクトップアプリである+ UseCompressedOopsフラグは、クライアントの古い4gbマシンに収まるほどメモリ使用量を低く抑え、32ビットjvmと比較してパフォーマンスを30%向上させたため、1日を節約します。
Alex Byrth 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.