2017-10-10 10 views
1

私はTomcat Webサーバーで構築されたJavaアプリケーションを持っています。 Javaミッションコントロールを使用すると、私はストレス下ではGCが非常に支配的であることを知っています。 GCサイクルごとに、CPUは非常に高くなります。 私が知りたいことは、各GCサイクルが正確に何をしているのか、特にどのオブジェクトが昇格しているのか、どのオブジェクトが解放されているのか知りたいのです。解放されるオブジェクトについては、どのタイプであるか、作成された場所を知りたいと思います。バイト[]やストリングスがたくさんあることを知っているのは、それらを作成できる場所がたくさんあるので、明らかに助けにならないのですが、ほんの少数しか私の支配下にあり、支配的です。Java GCが高い、どのオブジェクトがGCedであるかを調べる方法

誰でもツールや方法を知っていますか?

ありがとうございます。

+0

[フライト録画](https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr005.html)を使用しましたか? – nullpointer

+0

はい、フライトレコーダーは、GCがCPUスパイクを引き起こしていることをどのようにして知ったのですか?しかし、JFRは私が必要としている/説明した情報を提供していません。または、少なくとも私はその情報を取得する方法がわかりません –

+0

JFRプロファイルと一緒にGCログが原因を知るには十分に良いことがあります。 – nullpointer

答えて

1

収集するものではなく、オブジェクトの割り当てを記録する必要があります。漸近的なコレクションと割り当ては同じですが、後者は、発生時にはるかに多くの情報を提供することができます。

さまざまなJavaプロファイリングソリューションが、このような機能を提供します。

2

オプション1 - Javaフライトレコーダーallocation profiling optionを使用してください。私はあなたが死体に興味があることを理解していますが、そのトリックは新しい対象の大半がまもなく死んでしまうということです。

オプション2 - SJK死体ヒストグラム。 SJKはヒープのクラスヒストグラムをほとんど取りません(jmap -histoと同じ)、違いを報告します。死んだ人や若い死んだ人を計算するオプションがあります。

関連する問題