私は問題を説明するために簡単に試みます。私は商品/ SKUを扱うサプライチェーンドメインで働いています。Javaガベージコレクタによるパフォーマンスの低下?提案が必要です
私の問題はすべて100万SKUであり、アルゴリズムを実行しています。 私のJVMヒープサイズは4 GBです。
多くのメモリが必要になるため、すべてのSKUをワンショットで処理することはできません。 したがって、問題のセットをより小さなバッチに分割します。各バッチには、一緒に処理する必要があるすべての関連するSKUがあります。
ここでは、データセット全体を処理するためにいくつかの繰り返しを実行します。もし、各バッチが約保持しているとします。 5000 SKU、私は200反復/ループがあります。バッチが処理を完了するまで、5000 SKUのすべてのデータが必要です。しかし、次のバッチが開始されると、以前のバッチデータは不要となり、ガベージコレクションが可能になります。
これは問題の背景です。さて、GC - のために特定のパフォーマンスの問題に遭遇しました。各バッチは約2〜3秒で完了しています。さて、GCは、特定のバッチの処理が終わるまで、すべてのデータが必要になるため、この時間内にオブジェクトを解放することはできません.Goはこれらのオブジェクトをすべて古いGenに移動します(yourkitプロファイラを見ると、新世代ではほとんど何もない)。だから、古い世代はより速く成長しており、完全なGCが必要になり、私のプログラムは非常に遅くなります。このような場合にGCをチューニングする方法はありますか、または別の方法でメモリ割り当てを行うために自分のコードを変更することはできますか?
PS - 各バッチが非常に小さい場合、この問題は表示されません。これは、GCがバッチ処理が高速に完了し、古いジェネレーション内のオブジェクトを移動する必要がないため、オブジェクトを十分に高速に解放できるためです。
**プロファイラ**は、ガベージコレクタの10%以上を占めていると伝えましたか?またはそれは推測ですか? – RobAu
テンチャリングしきい値を変更します。どのようにあなたのGCに依存する - どのGCを使用していますか? –
Full GCの継続時間はどのくらいですか? –