スタンドアロン JVM で Java アプリを実行しています。アプリは 1 つ以上のソケットでデータをリッスンし、データをキューに入れ、キューからデータをプルして保持するスレッドをスケジュールします。データは幅広く、1 レコードあたり 700 を超えるデータ要素がありますが、すべてのデータ要素は小さな String、Integer、または Long です。
アプリは一定期間 (30 分から 1 時間) スムーズに実行されますが、その後 1 回以上のガベージ コレクションの一時停止が発生します。一時停止時間の大部分は、オブジェクトのコピー時間に費やされます。sys 時間も、他のコレクションに比べて高くなっています。
JVM の詳細は次のとおりです。
java version "1.7.0_03"
Java(TM) SE Runtime Environment (build 1.7.0_03-b04)
Java HotSpot(TM) 64-Bit Server VM (build 22.1-b02, mixed mode)
JVM オプションは次のとおりです。
-XX:MaxPermSize=256m -XX:PermSize=256m -Xms3G -Xmx3G -XX:+UseG1GC -XX:-UseGCOverheadLimit
プロセスは 4 つのコア (すべて同じソケット上) にタスクセットされていますが、そのうちの 2 つをほとんど使用していません。このボックスのすべてのプロセスは、独自のコアに固定されています (0 と 1 は未使用)。マシンには十分な空きメモリ (20+G) があり、上部は 2.5G の RES メモリを使用するプロセスを示しています。
これはgcログ出力の一部です...
[Object Copy (ms): 2090.4 2224.0 2484.0 2160.1 1603.9 2071.2 887.8 1608.1 1992.0 2030.5 1692.5 1583.9 2140.3 1703.0 2174.0 1949.5 1941.1 2190.1 2153.3 1604.1 1930.8 1892.6 1651.9
[Eden: 1017M(1017M)->0B(1016M) Survivors: 7168K->8192K Heap: 1062M(3072M)->47M(3072M)]
[Times: user=2.24 sys=7.22, real=2.49 secs]
オブジェクトのコピー時間とシステム時間が非常に高い理由と、それを修正する方法についてのアイデアはありますか? ログには、10 ミリ秒または 20 ミリ秒しかかからないほぼ同じ Eden/Survivors/Heap サイズの多数のガベージ コレクションがあります。