8

この質問はHotSpot 世代に限定されています。特定のインスタンスがどの世代に住んでいるかをプログラムで調べる方法はありますか? 次のようなデータ:

  • 若い世代か古い世代か?
  • 若い場合、どのサバイバー スペースですか?
  • TLABの中?どのスレッド?

次のようなことができる限り、任意の手法 (例: BTraceJVMTI ) が機能します。

Object x = new Object();
HotSpotGenerationInfo info = HotSpotGenerationUtil.getInfo(x);

物乞いは選択者になることはできませんが、理想的には、関心のあるインスタンスが発生した瞬間にある世代から別の世代に移動された時期を知ることもできます(つまり、イベント コールバックに基づいており、ポーリングに内在する遅延とオーバーヘッドには関心がありません)。

理由もなく「いいえ」と言う答えには興味がありません:)

4

2 に答える 2

4

私の知る限り、オブジェクトが現在どのメモリ プールに存在するかを直接クエリすることはできません。ただし、オブジェクトはガベージ コレクションの実行によって別のメモリ プールに昇格され、VM 以降のメジャー/マイナー gc 実行の数をクエリできます。 JMXの使用を開始します。オブジェクトの作成時にこれらのカウンターにさらに注意を払うと、オブジェクトが存在するプール以降、GC があったかどうかを再構築できます。

于 2010-12-16T02:30:23.963 に答える
3

「オブジェクトが作成されてからの GC の数をカウントする」アプローチには、さらに複雑な問題があります。時期尚早なオブジェクトのプロモーションは考慮されていません。

サバイバー スペースが基本的に小さすぎ、Eden からのメモリ プレッシャ (つまり、少なくとも 1 回生き残るオブジェクトの割合) が高い場合、オブジェクトは完全な Tenuring しきい値に達する前に Tenured に昇格されます。

実際の例では、通常、健全なアプリケーションの早期昇格率はゼロではありません。実際、0% の早期昇格率は本当に悪い兆候です。これは、サバイバー スペースが非常に大きく、大量のメモリを浪費していることを示しています。

于 2012-02-01T15:23:48.927 に答える