У нас есть приложение, чувствительное к задержке, и мы испытываем некоторые паузы, связанные с ГХ, которые мы не полностью понимаем. Иногда у нас есть небольшой сборщик мусора, который приводит к тому, что время паузы приложения намного больше, чем указанное время сборщика мусора. Вот пример фрагмента журнала:
485377.257: [GC 485378.857: [ParNew: 105845K-> 621K (118016K), 0,0028070 с] 136492K-> 31374K (1035520K), 0,0028720 с] [Times: user = 0,01 sys = 0,00, реальный = 1,61 с]
Общее время, в течение которого потоки приложений были остановлены: 1.6032830 секунд
Общее время паузы здесь на порядки больше, чем указанное время GC. Это единичные и случайные события: непосредственно предшествующие и последующие незначительные события GC не показывают такого большого расхождения.
Процесс выполняется на выделенной машине, с большим количеством свободной памяти, 8 ядрами, с Red Hat Enterprise Linux ES Release 4 Update 8 с ядром 2.6.9-89.0.1EL-smp. Мы наблюдали это с (32-битными) версиями JVM 1.6.0_13 и 1.6.0_18.
Мы работаем с этими флагами:
-server -ea -Xms512m -Xmx512m -XX: + UseConcMarkSweepGC -XX: новый размер = 128 м *
Кто-нибудь может предложить какое-то объяснение относительно того, что здесь может происходить, и / или какие-то пути для дальнейшего расследования?