アプリケーションの起動時に、HashMapを使用していくつかの重要なデータをキャッシュしています。
このキャッシュは、いつか大きくなり、その後減少します。RAMにどのくらいのメモリを使用しているか知りたいです。
KB単位のマップでメモリを取得することは可能ですか?APIはありますか?
5 に答える
私はこの方法を使用してMAPサイズを推定しています:
public static void size(Map map) {
try{
System.out.println("Index Size: " + map.size());
ByteArrayOutputStream baos=new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(baos);
oos.writeObject(map);
oos.close();
System.out.println("Data Size: " + baos.size());
}catch(IOException e){
e.printStackTrace();
}
}
この目的に適したツールがあります:ClassMexer
参照されるオブジェクトを含むHashMapのメモリは、次の方法で見積もることができます。
long noBytes = MemoryUtil.deepMemoryUsageOf(myCacheMap);
Map
もちろん、オブジェクト自体ではなく、ヒープ上に存在するオブジェクトへの参照を保持していることに気付きます。Map
したがって、キーと値のバイトを合計するために参照ツリー全体を追跡せずに、がどれだけのメモリを消費しているかを尋ねることは無意味です。
オブジェクトはそれを行いません。それを達成する方法はありません。
上記の賢明なコメントのように、すべてのプラグインを備えたVisual VMを入手し、アプリのプロファイルを作成します。
インストルメンテーションなしでオブジェクトの実際のサイズを計算することは事実上不可能です。
ポインタのサイズ、プリミティブ型、オブジェクトのオーバーヘッドなどを指定して計算できる場合もありますが、コンテンツを含むHashMapのように複雑なものに対して計算できます(実際のサイズのサイズは、その履歴とハッシュ係数、およびハッシュ係数を法とするそのすべての要素)はほぼ不可能です。
唯一の実際の解決策は、 EclipseMatなどのヒープアナライザーを使用することです。
これは、JVMベンダーとバージョンに大きく依存します。大まかな見積もりについては、このプレゼンテーションをご覧ください。