どのGC生成がインスタンスが生きているかをプログラム的に見つけることができますか?
-
10-10-2019 - |
質問
この質問の範囲は限られています ホットスポット世代. 。特定のインスタンスがどの世代が生きているかをプログラム的に見つける方法はありますか?次のようなデータ:
- 老いまたは古い世代?
- 若い場合、どのサバイバースペースですか?
- TLABの中?どのスレッド?
任意のテクニック(例、 btrace, jvmti)私がこのようなことができる限り働く:
Object x = new Object();
HotSpotGenerationInfo info = HotSpotGenerationUtil.getInfo(x);
be食は選択者になることはできませんが、理想的には、関心のあるインスタンスがいつ世代から別の世代に移動されていたかを学ぶことができました 現時点でそれは起こります (つまり、イベントコールバックベース - 投票に暗黙的に遅延とオーバーヘッドに興味がありません。)
正当化なしに「いいえ」と言うだけの答えに興味がありません:)
解決
私の知る限り、オブジェクトが現在住んでいるメモリプールを直接照会することはできません。ただし、オブジェクトはごみ収集の実行によって別のメモリプールに宣伝され、VM以降のメジャー/マイナーGCの数の数をクエリすることができます。 JMXの使用を開始します。オブジェクトが作成されたときにこれらのカウンターにさらに注意を払うと、オブジェクトがプールしているものからGCがあるかどうかを再構築できます。
他のヒント
「オブジェクトが作成されてからGCの数を数える」アプローチには、追加の複雑さがあります - それは考慮されていません 未熟なオブジェクトプロモーション.
生存スペースが基本的に小さすぎて、エデンからのメモリ圧力(つまり、少なくとも1回生存するオブジェクトの速度)が高い場合、オブジェクトは完全な在職のしきい値に達する前に延長されます。
実際の例では、健康的なアプリケーションは通常、早期昇進の割合ではありません。実際、0%の早期昇進率は本当に悪い兆候です - それはあなたのサバイバースペースが大きすぎて大きすぎて、あなたが多くの記憶を無駄にしていると言います。