メモリのオーバーヘッドは何ですか?
作成したフィールドより多くのメモリが使用されている場合。
ですか?
一部は、常に先頭のヘッダーを除き、オブジェクト内のどこにでも表示できるパディングです。ヘッダーは通常8-12バイトの長さです。
圧縮ポインタを持つJVMとは何ですか?
メモリを節約するために64ビットJVMで32ビットポインタを使用する手法。
は参考ですか?
参考文献はこの手法を使用できますが、オブジェクトのクラス情報を参照することもできます。
32ビットJVMを使用すると、オーバーヘッドは少なくなりますか?
おそらく、参照とクラスの圧縮ポインタの使用と同じですが、
パッディングのためですか?
64ビットポインタは32ビットポインタよりも多くの領域を使用するからです。
32ビットJVMをメモリの効率やパフォーマンスに使用する方がよいでしょうか?
いいえ、32ビットプロセッサモデルでは、64ビットモデルの2倍のサイズ(64ビット)のレジスタが2倍であるため、最も高速に保持できることを意味しますメモリ、レジスタ。 64ビットの計算モデルでは、64ビットの計算も高速になる傾向があります。
一般的には、a)できない、またはb)非常に少量のメモリがない限り、常に64ビットJVMを使用することをお勧めします。
開始時のこのイメージでは、16バイトのJVMオーバーヘッドとして表示されます。
これは厳密には正しいとは限りません。これは、圧縮されていないクラス参照があるので、ヘッダーは12バイトですが、オブジェクトはデフォルトで8バイトに整列されます。つまり、の末尾に4バイトの埋め込みがあります。(合計16バイトですが、開始)
FAQ:なぜ32ビットの圧縮OOPは、4 GB以上
に対処することができる
オブジェクトは、デフォルトで整列した8バイトでなければなりません。これにより、メモリ管理が簡単になりますが、ときどきパディングが無駄になります。副作用は、すべてのオブジェクトのアドレスが最低3ビット(000の8の倍数でなければならない)の000を持つということです。これらのビットは格納する必要はありません。これにより圧縮されたoopsが8 * 4 GBまたは32 GBに対処できます。
16バイトのオブジェクト整列でJVMは
IFAQ(但しパディングオーバーヘッドが高く、それを価値がないかもしれない)32ビット参照して、64ギガバイトに対処することができる:なぜ周りに28でそれが遅いです - 32 GB
参照に8を掛けることができますが、ヒープはメモリの開始時に開始しません。通常は約4 GB後に開始されます。これは、完全な32 GBが必要な場合、このオフセットを追加する必要があることを意味します。これには若干のオーバーヘッドがあります。
ヒープサイズ:x64のこのdouble[]
とlong[]
28を支持するための命令を有する:
- < 4ギガバイト - 8または
<< 3
注により乗算 - 28ギガバイト - ゼロアドレス
- 4を延長 - 32GB - 8倍し、オフセットを保持するレジスタを追加します。やや遅いですが、通常は問題ではありません。
32ビット64ビットJVMについて:http://stackoverflow.com/questions/17285928/jre-32bit-vs-64bit – GhostCat
@GhostCat 32ビットがメモリ消費の方が良ければ...理由は何か64ビットのjvm用?それは32ビットが4GBのヒープまたは圧縮されたoopsに制限されているからですか? –
http://openjdk.java.net/projects/code-tools/jol/ – the8472