Java のメモリ オーバーヘッドについてお聞きしたいのですが、大きな ArrayList (61,770 項目) があり、各項目 (オブジェクトとその ArrayList エントリをカウント) が消費するメモリ量を計算しようとしています。すべてのデータがロードされた後、ヒープは ~ 25Mb かかります。ArrayList に項目が 2 つしかない場合、ヒープは ~1Mb かかるので、大まかに:
(24*1024*1024)/61,768 = 407 バイト。
ただし、各オブジェクトのフィールドをカウントすると、148 バイトが得られます (ArrayList を含まず、int=4、float=4、reference=4 と仮定します)。これらの余分なバイトがすべてどこから来たのか知りたいです。から...
ArrayList に格納するオブジェクトはインターフェイスを実装しているため、追加の値を格納していると推測できます。VM は、実装されたメソッドごとに 4 バイトの関数ポインタを格納している可能性があります。彼らが実装するインターフェースには20の機能があるため、さらに80バイト、合計228バイトですが、測定された400バイトにはまだ近くありません。
任意の助けをいただければ幸いです。
うわー、すべての素晴らしい答えをありがとう。
@Bolo: リンクに感謝します。このクラスでは、オブジェクトごとに最大 350 バイトを測定するため、大量のメモリ使用量の原因を確認することはほとんどできません。
@Yuval A: 貴重な情報源であるプレゼンテーションに感謝します。
@ウッコ:指摘された点。
@Jayan: 現在、ヒープをダンプしようとすると、NetBeans プロファイラーでエラーが発生します。後で再試行します。