Я запускаю приложение с интенсивной памятью на машине с 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 минут).
Другое дело, что я думал, что только FULL GC вызовет приостановку потоков, но они, похоже, не являются полными GC.
Возможно, важно отметить, что большая часть памяти занята кешем памяти LRU, который использует мягкие ссылки.
Вам будет очень благодарна любая помощь или совет.