最初に、作成するオブジェクトの詳細を説明します。そして質問します(最後に)。
私は64を使用していますが、LinuxでJVMを使用しています。
私のjvmオプションは次のとおりです。 -Xmx6g -Xms3g -XX:MaxPermSize=256m
プロファイラー (jprofiler) は、大量のメモリを消費している 2 つの場所を示しています。他のいくつかの文字列の割り当てなども実行されますが、プロファイラーは StringUtils.replace がほとんどのメモリを保持していることを明確に示しています。2) ここでは、(単一クラスの) 4 つのオブジェクトを含むオブジェクト (3.5MB の場合は保持サイズ) が 1 分間に 1 つ作成され、静的な並行ハッシュマップに (再) 配置されます (したがって、マップには常に 1 つのオブジェクトのみが含まれます)。親オブジェクトが持っているのはこれら 4 つの子オブジェクトだけで、他には何もありません。これらの 4 つのオブジェクトのそれぞれには、10K の配列リスト、10K の日付、およびその他の文字列などが含まれています。古い親オブジェクト (map.replace() から取得したもの) を明示的に null に割り当て、(ArrayList.clear()) を明示的にクリアしています。 ArrayList、
メモリの動作は次のとおりです。メモリ使用量が増加し続け、ある時点でメジャー コレクション (2GB) が発生します。マイナー コレクション (700MB) も 1 分に 1 回程度発生します。
質問: #1 が実際に Eden スペースをいっぱいにして、JVM が #2 のオブジェクトを保有スペースにプッシュし、メモリ使用量がメジャー コレクションが発生するまで増加し続けると思いますか? 診断目的で、#2 の親オブジェクトを 500KB のサイズを保持するように変更しました (7 分の 1 で、Date、ArrayList などのインスタンスも 1.4K です)。それでも同じメモリ動作が見られます。
オプションを -Xmx12g -Xms3g -XX:MaxPermSize=256m -XX:NewSize=8g に変更しました 現在、メモリ内の #2 のオブジェクトの数が少ないことがわかります 保有スペース/古い世代の増加が遅いことがわかります。#2 のオブジェクトがすぐに収集されるのは良いことですが、マイナー コレクションが巨大 (8G) になり、2 分ごとに発生するため、CPU 使用率が非常に高くなります。
私の目標は、すべてのオブジェクトをすばやく収集することです (したがって、メモリ使用量が絶えず増加することはありません) が、マイナー コレクションが大きくなりすぎないようにします。
私が取るべきアプローチについて何か提案はありますか?