pcalcao が述べたように、JVM はガベージ コレクションに多くの時間を費やしており、実際の作業を十分に行っていないため、救済しようとしています。
これは、実際にはメモリが不足していないが、十分に近いため、実際には前進していないというケースを回避するための一種の安全弁です。この点については詳しく説明しません。この回答にはさらに詳細がありますが、あなたのケースに当てはまる可能性のあるいくつかのことについて言及します。
これは、物事をキャッシュする場合に発生する可能性が高くなりSoftReference
ます。ヒープが最大サイズに向かって成長すると、これらの参照がクリアされ、(キーループが触れているかどうかに応じて) 繰り返し再生成される可能性があり、GC が常に発生するという悪い動作が発生します。ただし、いくつかのソフト参照をクリアできるため、続行するのに十分なメモリを常に回復します.JDKでさえ、Locale
クラスでこの種のキャッシュを使用しているため、これに悩まされています.
-XX:-UseGCOverheadLimit を本当に使用したい場合は、この動作を無効にすることができます。それでも、それが示す問題は現実のものです。実際の作業に費やす時間はランタイムの 2% 未満です。
これらのメモリ値をどこに出力していますか? プログラムの構造によっては、大量のガベージが生成され、一部の内部ループでほとんどのヒープが使用されている可能性がありますが、診断出力を配置した場所では、ガベージが再利用されています。-verbose:gc を使用すると、実際の GC の動作をよりよく把握できます。