5

私はwhat-is-the-memory-consumption-of-an-object-in-javawhat-is-the-memory-overhead-of-an-object-in-javaと読みました。実際にメモリオーバーヘッドはJavaにどのようなものがありますか?

しかし、まだ私は混乱しています。

  • メモリオーバーヘッドとは何ですか?それはpaddingですか?
  • 圧縮ポインタ付きJVMとは何ですか?それはreferenceですか?
  • 32-bit JVMを使用すると、オーバーヘッドは少なくなりますか?もちろんですが、パッディングのためですか?
  • メモリ効率やパフォーマンスのために常に32-bit JVMを使用する方が良いですか?画像の下

this link(ページ第26号)からのものである

この画像では、なぜそのように、それらは16バイトのJVMオーバーヘッドとして示さ自体を始動時?

enter image description here

+1

32ビット64ビットJVMについて:http://stackoverflow.com/questions/17285928/jre-32bit-vs-64bit – GhostCat

+0

@GhostCat 32ビットがメモリ消費の方が良ければ...理由は何か64ビットのjv​​m用?それは32ビットが4GBのヒープまたは圧縮されたoopsに制限されているからですか? –

+0

http://openjdk.java.net/projects/code-tools/jol/ – the8472

答えて

7

メモリのオーバーヘッドは何ですか?

作成したフィールドより多くのメモリが使用されている場合。

ですか?

一部は、常に先頭のヘッダーを除き、オブジェクト内のどこにでも表示できるパディングです。ヘッダーは通常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バイトのオブジェクト整列でJ​​VMは

IFAQ(但しパディングオーバーヘッドが高く、それを価値がないかもしれない)32ビット参照して、64ギガバイトに対処することができる:なぜ周りに28でそれが遅いです - 32 GB

参照に8を掛けることができますが、ヒープはメモリの開始時に開始しません。通常は約4 GB後に開始されます。これは、完全な32 GBが必要な場合、このオフセットを追加する必要があることを意味します。これには若干のオーバーヘッドがあります。

ヒープサイズ:x64のこのdouble[]long[]

  • 28を支持するための命令を有する:

    • < 4ギガバイト - 8または<< 3注により乗算 - 28ギガバイト - ゼロアドレス
    • 4を延長 - 32GB - 8倍し、オフセットを保持するレジスタを追加します。やや遅いですが、通常は問題ではありません。
  • +0

    .thanks ..しかし、まだ1つの疑問は何ですか?それは8-12バイトを消費することになりますか? –

    +0

    そして、64ビットポインタは32ビットポインタよりも多くの領域を使用するためです。* ...圧縮されたoopsについてはどうでしょうか? –

    +1

    @Samヘッダーは、オブジェクトの先頭にある情報です。これは、オブジェクトのシステムのhashCodeと、あなたが持っているオブジェクトのタイプを言うためのクラスポインタを含みます。ヘッダーのつぶやきの例は次のとおりです。https://github.com/peter-lawrey/Performance-Examples/blob/master/src/main/java/vanilla/java/unsafe/UnsafeIdentityDemo.java –

    関連する問題