После попытки множества различных настроек JVM GC и проведения большого тестирования, когда у меня были проблемы с длинными крупными GC-паузами, я сейчас тестирую G1GC JVM GC. Помимо этого, я также собираю данные с монитором производительности, и только приложения, которые работают (помимо системных служб, ...), - это сервер GlassFish с моим приложением. Я не нашел ничего странного в протоколе мониторинга производительности (использование процессора составляет около 5-10%, и оно становится немного выше, когда происходит GC, память составляет около 60%, ...). Это теперь пятый день тестирования, и я заметил следующее:JVM GC работает очень странно
До второй крупный (смешанный) GC не произошло все было хорошо (второстепенный GC было около 20мс долго, производительность GC был 160000M/с, ...) , Второй крупный GC занял около 2 секунд (длинные - первые заняли 150 мс, но не критические), и после этого младший GC намного дольше, чем раньше (см. Серые линии на изображении, которые представляют продолжительность младшего (молодого) GC) и производительность GC составляет всего 12000 М/с и все еще падает. Мне интересно, почему это происходит после второго основного GC, даже никаких других приложений не работает, а использование ЦП/памяти такое же, как раньше. Я не знаю, что здесь происходит. У меня также есть еще один вопрос: я выполняю те же тесты на разных ПК, у которых меньше оперативной памяти и более старых процессоров, а производительность GC составляет около 5000 М/с (младший GC составляет около 50-100 мс), что я считаю нормальным из-за худшего процессора и меньше оперативной памяти. Странно то, что основной GC еще не состоялся после 3 дней работы, и старое поколение растет намного медленнее, чем здесь, даже настройки одинаковы. Почему растет намного медленнее (здесь около 150 МБ за два дня, на втором ПК 80 МБ за три дня)? Спасибо за все ваши ответы, я не знаю, почему GC работает так ненормально (сначала она работает нормально, а затем ухудшается производительность).
EDIT: here является лог-файл полный GC, который был импортирован в GCViewer, а также детали события статистика из GCViewer:
Вход на 3-й основной GC:
2015-06-08T08:09:13.123+0200: 572815.533: [GC concurrent-root-region-scan-start]
2015-06-08T08:09:13.139+0200: 572815.560: [GC concurrent-root-region-scan-end, 0.0271771 secs]
2015-06-08T08:09:13.139+0200: 572815.560: [GC concurrent-mark-start]
2015-06-08T08:09:16.302+0200: 572818.721: [GC concurrent-mark-end, 3.1612900 secs]
2015-06-08T08:09:16.318+0200: 572818.729: [GC remark 572818.729: [Finalize Marking, 0.0002590 secs] 572818.729: [GC ref-proc, 0.4479462 secs] 572819.177: [Unloading, 3.2004912 secs], 3.6499382 secs]
[Times: user=0.20 sys=0.08, real=3.64 secs]
Опять же, реальная время было намного выше, чем пользователь + sys, фаза разгрузки заняла более 3 секунд.
Пожалуйста, опишите, что же цвета означают и какие это растущие линии. И можем ли мы увидеть длительность основного GC здесь? Если да, то где они? – AdamSkywalker
Можете ли вы предоставить необработанные журналы GC для интересующего периода времени? также убедитесь, что вы вошли в журнал с помощью '-XX: + PrintGCDetails' – the8472
Хорошо, фиолетовая линия - это пожизненное (старое) поколение, синие линии - это куча (так в основном молодое поколение, потому что оно начинается от линии старого поколения) вместе, серые линии внизу незначительные GC-времена, основные GC-времена (параллельные коллекции для старого поколения, а не полные GC) - это две желтые линии, где размер кучи падает (сначала занял 0,1 с и почти почти 2 секунды). Этот график из приложения GCViewer. Я сразу же загружу необработанные журналы GC. – user4341206