12

最近、クラスを書いていて、インスタンスのメモリ消費量を要素あたり約 10 バイト削減できることを発見しましたが、コードがはるかに複雑になるという代償が伴います。これにより、コンパイルされた.classファイルのサイズが最大 10KB 増加しました。

JVM はファイルをメモリにロードする必要があると想定している.classため、少なくとも 1000 個の要素が存在しない限り、これらの変更は元に戻りません。しかし、クラス ファイル内の余分な 10 KBがコードの複雑さの増加による唯一のコストでない限り、その計算はうまくいきません。

この Oracle ブログ.classは、ファイルに基づいているだけでなく、permgen のクラスによってかなりの量の余分なメモリが消費されていることを示唆しています。

したがって、この質問には 2 つの部分があります。

  • 特定のクラスの実際の permgen メモリ消費量を測定するにはどうすればよいですか? 実行時にインストルメンテーションを使用するか、プロファイリング ツールを使用しますか?
  • クラスを書いているときに、クラスの permgen メモリ消費量を見積もる方法はありますか? (いくつかの背景知識があれば、クラス インスタンスを作成する際に、クラス インスタンスのメモリ消費量を見積もることができます。クラス自体の permgen メモリ消費量を見積もることができるかどうか疑問に思っています。)

Dalvik VM についても同様の詳細を教えていただければ幸いですが、私は主に OpenJDK とその他の「主流」の JVM に焦点を当てています。

4

2 に答える 2

4

特定のクラスの実際の permgen メモリ消費量を測定するにはどうすればよいですか? 実行時にインストルメンテーションを使用するか、プロファイリング ツールを使用しますか?

1 つのアプローチとして、クラスをロードして別のクラスローダで測定し、jmap -permstatこのブログ エントリで説明されているように使用することが考えられます。

クラス・ローダー・オブジェクトごとに、次の詳細が出力されます。

  1. ユーティリティが実行されたときのスナップショットでのクラスローダーオブジェクトのアドレス。
  2. ロードされたクラスの数 (メソッド (java.lang.ClassLoader.defineClass) を使用してこのローダーによって定義されます)。
  3. このクラス・ローダーによってロードされたすべてのクラスのメタデータによって消費されるおおよそのバイト数。
  4. 親クラスローダーのアドレス (存在する場合)。
  5. 「ライブ」または「デッド」表示 – ローダー オブジェクトが将来ガベージ コレクションされるかどうかを示します。
  6. このクラスローダーのクラス名。
于 2012-06-12T11:35:40.380 に答える
0

これは、2 番目のポイントに対する回答です。これがどれほど役立つかはわかりませんが、メモリ効率の高い Java アプリケーションの構築: プラクティスと課題に関するプレゼンテーションのスライドは、さまざまな Java オブジェクトのサイズと正常性を見積もるのに非常に役立ちます。彼は、32 ビットおよび 64 ビットの JVM でオブジェクトのサイズを見積もる際に詳細に説明し、オブジェクトのメモリ効率を高めるためのポインターも提供します。

于 2012-06-11T18:28:44.717 に答える