各若いGCイベントの後、古い世代に昇格した若い世代のメモリの構成を決定する最良の方法を教えてください。
理想的には、「若い世代 -> 古い世代」の各プロモーション チャンクのヒープの 80% を担当するクラス名を知りたいです。
例: 私には 6 億人の若い世代がいて、在職期間ごとに 600 万人が昇進します。この 6M を構成するオブジェクトを知りたいです。
ありがとうございました。
各若いGCイベントの後、古い世代に昇格した若い世代のメモリの構成を決定する最良の方法を教えてください。
理想的には、「若い世代 -> 古い世代」の各プロモーション チャンクのヒープの 80% を担当するクラス名を知りたいです。
例: 私には 6 億人の若い世代がいて、在職期間ごとに 600 万人が昇進します。この 6M を構成するオブジェクトを知りたいです。
ありがとうございました。
これを行う簡単な方法はありませんが、私は最近、大規模な Java アプリのメモリ パフォーマンスを分析しており、いくつかの経験を共有できます。
古い世代に昇格されているオブジェクトを見つけた方法は次のとおりです。
最初に、「古い/tenured」スペースにあるオブジェクトを特定する必要があります。これは基本的に、標準的な Java ヒープ分析です。これには jmap をお勧めします。これは、sun jvm の一部です。run:
jmap -dump:file=heap.hprof PID
ヒープ ダンプを取得します。これにより、ダンプ中にjvmが一時停止します(2GBヒープで〜30秒間)
次に、.prof ファイルをメモリ アナライザーにロードします(これに最適なツールです)。メモリ アナライザーで 1 日遊んで理解し、スクリーンカメラを見てください (ログインが必要ですが、それだけの価値があります)。
これで、ヒープ内にあるオブジェクトがわかります。
トリックは次のとおりです。メモリアナライザーの概要画面に、「到達不能オブジェクトのヒストグラム」へのリンクがあります。これで、これらのオブジェクトはすべて次の GC で収集されます。しかし、おそらくエデンにいる人もいれば、サバイバーにいる人もいるし、オールドにいる人もいます。
さて、メモリプロファイリング機能を備えたプロファイラーを入手してください。私はyourKitを好みます。キットを使用してアプリを実行し、オブジェクトの割り当てを記録します。
それを実行し、オブジェクトの作成を記録します。オブジェクトのリストを作成したら、3 つのリストすべてを使用して、何が起こっているかを把握します。人間が最も得意とすることを行い、パターンを見てください。
もう 1 つのアプローチ方法は、YourKit世代ビューです。ヒープのスナップショットを取り、スナップショット間でまだ生きているオブジェクトを比較できます。これをvisualgcと一緒に使用すると、古い世代に昇格するためにオブジェクトが生きている必要がある期間を決定し、これらの間隔でスナップショットを作成して、どのオブジェクトがまだ生きているかを確認できます。
では、頑張ってね。/JT