2016-11-12 10 views
1

レポートを計算することを目的としたアプリケーションで作業しています。どのFinalizerに時間がかかるかを見つける方法

私のアプリケーションは大量のメモリを使います。 100以上のGo。

私の最後のリリース以来、私は大きなパフォーマンスの低下に気付きました。私の調査によると、計算中、40秒から60秒の間に多くのガベージコレクションが発生することがわかります。 (JMCは、彼らがSerialOldですが、私はそれが正確に何を意味するのか分からないと言われます)と、JVMは、ガベージコレクションのときはもちろん、アプリケーションは絶対に

を凍結されて、私は今、調査していますこれらのガベージコレクションの起源...これは非常に難しい作業です。

私はこれらのガベージコレクションがあまりにも長い間されている場合、彼らはfinalize機能に何回も費やしているので、それは(私たちは他のチームからの統合すべてのライブラリの中で、そのうちのいくつかは、ファイナライザを使用しています、ということを知っている)である、と思われる

しかし、私はこの仮説をどのように納得するか(またはしないか)わからない。どのファイナライザが時間がかかるかを見つける方法。 JVisualVM を経由して、私はここで良いツール、さらには優れた方法論

を探しています

データが収集されTaken from JVisualVM's "Tracer" tab

あなたが見ることができるように、私が持っているとき、私はいつも多くの「保留中のファイナライザを」持っていますa 古いゴミをログに記録

私はJVisualVMを使用しているとき、上記のグラフ は、右から左へ定期的にスクロールします。古いゴミが がトリガーされると、スクロールが停止します(ここまでは通常のようですが、これは の終わりです)。突然再始動スクロールしたときしかし、それは ない旧ごみの終わりからではなく、保留中のシリアライザ

の端からこれは私がファイナライザは、JVM

を遮断されたことは、誰でものため、について説明を持っているんだと思いますんこの?

ありがとうございました フィリップ

+2

'finalize'メソッドはガベージコレクション中に*実行されません*。 – apangin

+0

"SerializeOld"ガベージコレクションの場合でも? あなたの答えは –

+2

ありがとうございます。同時でないGCフェーズでは、Javaコードは実行されません。 GCのみ*ファイナライズ可能なオブジェクトを検出し、キューに追加します。このキューは後で['Finalizer']によって処理されます(http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/8b04ee324a1a/src/share/classes/java/lang/ref/Finalizer.java# l186)他のJavaスレッドと共に動作するJavaスレッド。 – apangin

答えて

1
ここ

私はあなたのファイナライザ理論を調査するために何をするのかです。

  1. お気に入りのJavaプロファイラを使用してJVMを起動します。

  2. 完全なヒープを得るのに十分な長さの間、実行しておいてください。

  3. プロファイラを起動します。

  4. トリガーガベージコレクション。

  5. プロファイラーを停止します。

今、あなたは多くの時間を使用している(もしあれば)finalize方法を把握するために、プロファイラ情報を使用することができます。


はしかし、私は、本当の問題は、メモリリークになると思われる、とあなたのJVMは、ヒープがunreclaimableオブジェクトでいっぱいにされてポイントになっていること。それは頻繁な "SerialOld"ガベージコレクションを説明することができます。

また、これは大きなヒープ問題になる可能性があります。 100Gbは...大きいです。

2

私のアプリケーションは大量のメモリを使います。 100以上のGo。

JMCは、彼らがSerialOldが、私はあなたがして、長い一時停止がシリアルコレクタであるため、予想される100ギガバイトのヒープのためのシリアルコレクタを使用している場合、それは正確に

を意味するものを知らないことを私に伝えますシングルスレッドのコアと1つのコアは、単位時間あたり非常に多くのメモリを消費するだけです。

マルチスレッドコレクタのいずれかを選択するだけで、一時停止時間が短くなるはずです。

しかし、私はこの仮説をどのように納得する(またはしない)かわかりません。どのファイナライザが時間がかかるかを見つける方法。

一般的には、より多くのデータを集めます。 GC関連の場合、GCロギングを有効にする必要があります(アプリケーションやサードパーティのライブラリであれば、プロファイラが必要です)。

+0

参考:G1GCガベージコレクタを使用しています –

+0

「シリアルコレクタを使用している場合」1)シリアルコレクタとはどういう意味ですか? 2)別のものを使うことができるのですか?どうやって? –

+1

あなたの質問によると、* SerialOld *は、G1GCと相互に排他的です。 *どのように?*スタックオーバフローに関するその他の回答が多数あり、Oracleのガベージコレクタのドキュメントも同様です。 – the8472

関連する問題