Я запускаю приложение с интенсивным использованием памяти на компьютере с 16 ГБ ОЗУ и 8-ядерным процессором, а Java 1.6 работает под управлением CentOS версии 5.2 (Final). Точные детали JVM:
java version "1.6.0_10"
Java(TM) SE Runtime Environment (build 1.6.0_10-b33)
Java HotSpot(TM) 64-Bit Server VM (build 11.0-b15, mixed mode)
Я запускаю приложение со следующими параметрами командной строки:
java -XX:+UseConcMarkSweepGC -verbose:gc -server -Xmx10g -Xms10g ...
Мое приложение предоставляет API-интерфейс JSON-RPC, и моя цель - отвечать на запросы в течение 25 мс. К сожалению, я вижу задержки до 1 секунды и более, и это, похоже, вызвано сборкой мусора. Вот некоторые из более длинных примеров:
[GC 4592788K->4462162K(10468736K), 1.3606660 secs]
[GC 5881547K->5768559K(10468736K), 1.2559860 secs]
[GC 6045823K->5914115K(10468736K), 1.3250050 secs]
Каждое из этих событий сборки мусора сопровождалось отложенным ответом API, очень похожим по длительности с показанной длиной сборки мусора (с точностью до нескольких мс).
Вот несколько типичных примеров (все они были созданы в течение нескольких секунд):
[GC 3373764K->3336654K(10468736K), 0.6677560 secs]
[GC 3472974K->3427592K(10468736K), 0.5059650 secs]
[GC 3563912K->3517273K(10468736K), 0.6844440 secs]
[GC 3622292K->3589011K(10468736K), 0.4528480 secs]
Дело в том, что я думал, что UseConcMarkSweepGC позволит избежать этого или, по крайней мере, сделать его крайне редким. Напротив, задержки, превышающие 100 мс, происходят почти раз в минуту или более (хотя задержки, превышающие 1 секунду, значительно реже, возможно, каждые 10 или 15 минут).
Другое дело, что я думал, что только полный сборщик мусора приведет к приостановке потоков, но это не полные сборщики мусора.
Может быть уместно отметить, что большая часть памяти занята кэшем памяти LRU, который использует мягкие ссылки.
Любая помощь или совет будет принята с благодарностью.