レポートを計算することを目的としたアプリケーションで作業しています。どのFinalizerに時間がかかるかを見つける方法
私のアプリケーションは大量のメモリを使います。 100以上のGo。
私の最後のリリース以来、私は大きなパフォーマンスの低下に気付きました。私の調査によると、計算中、40秒から60秒の間に多くのガベージコレクションが発生することがわかります。 (JMCは、彼らがSerialOldですが、私はそれが正確に何を意味するのか分からないと言われます)と、JVMは、ガベージコレクションのときはもちろん、アプリケーションは絶対に
を凍結されて、私は今、調査していますこれらのガベージコレクションの起源...これは非常に難しい作業です。
私はこれらのガベージコレクションがあまりにも長い間されている場合、彼らはfinalize
機能に何回も費やしているので、それは(私たちは他のチームからの統合すべてのライブラリの中で、そのうちのいくつかは、ファイナライザを使用しています、ということを知っている)である、と思われる
しかし、私はこの仮説をどのように納得するか(またはしないか)わからない。どのファイナライザが時間がかかるかを見つける方法。 JVisualVM を経由して、私はここで良いツール、さらには優れた方法論
ありがとうございました フィリップを探しています
あなたが見ることができるように、私が持っているとき、私はいつも多くの「保留中のファイナライザを」持っていますa 古いゴミをログに記録
私はJVisualVMを使用しているとき、上記のグラフ は、右から左へ定期的にスクロールします。古いゴミが がトリガーされると、スクロールが停止します(ここまでは通常のようですが、これは の終わりです)。突然再始動スクロールしたときしかし、それは ない旧ごみの終わりからではなく、保留中のシリアライザ
の端からこれは私がファイナライザは、JVM
を遮断されたことは、誰でものため、について説明を持っているんだと思いますんこの?
'finalize'メソッドはガベージコレクション中に*実行されません*。 – apangin
"SerializeOld"ガベージコレクションの場合でも? あなたの答えは –
ありがとうございます。同時でない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