Незначительный GC и полный GC одновременно?

Вот часть журналов GC, которая показывает полное событие CMS GC:

2016-12-29T22:44:34.741-0500: 27572.982: [GC (CMS Initial Mark) [1 CMS-initial-mark: 2508212K(23068672K)] 2931097K(26843584K), 0.0213349 secs] [Times: user=0.22 sys=0.00, real=0.02 secs] 
2016-12-29T22:44:34.763-0500: 27573.004: [CMS-concurrent-mark-start]
2016-12-29T22:44:36.013-0500: 27574.254: [CMS-concurrent-mark: 0.208/1.250 secs] [Times: user=3.07 sys=0.10, real=1.25 secs] 
2016-12-29T22:44:36.014-0500: 27574.255: [CMS-concurrent-preclean-start]
2016-12-29T22:44:36.061-0500: 27574.303: [CMS-concurrent-preclean: 0.047/0.048 secs] [Times: user=0.12 sys=0.00, real=0.05 secs] 
2016-12-29T22:44:36.062-0500: 27574.303: [CMS-concurrent-abortable-preclean-start]
 CMS: abort preclean due to time 2016-12-29T22:44:41.339-0500: 27579.580: [CMS-concurrent-abortable-preclean: 4.084/5.277 secs] [Times: user=9.53 sys=0.46, real=5.27 secs] 
2016-12-29T22:44:41.356-0500: 27579.598: [GC (CMS Final Remark) [YG occupancy: 3509179 K (3774912 K)]2016-12-29T22:44:41.357-0500: 27579.598: [Rescan (parallel) , 0.0816014 secs]2016-12-29T22:44:41.438-0500: 27579.680: [weak refs processing, 0.0000347 secs]2016-12-29T22:44:41.438-0500: 27579.680: [class unloading, 0.0292451 secs]2016-12-29T22:44:41.468-0500: 27579.709: [scrub symbol table, 0.0069857 secs]2016-12-29T22:44:41.475-0500: 27579.716: [scrub string table, 0.0010933 secs][1 CMS-remark: 2508212K(23068672K)] 6017391K(26843584K), 0.1194737 secs] [Times: user=2.18 sys=0.00, real=0.12 secs] 
2016-12-29T22:44:41.477-0500: 27579.718: [CMS-concurrent-sweep-start]
2016-12-29T22:44:41.618-0500: 27579.860: [GC (Allocation Failure) 2016-12-29T22:44:41.619-0500: 27579.860: [ParNew: 3579431K->419392K(3774912K), 5.7752364 secs] 6080306K->3302237K(26843584K), 5.7769753 secs] [Times: user=4.70 sys=8.50, real=5.78 secs] 
2016-12-29T22:44:47.698-0500: 27585.940: [CMS-concurrent-sweep: 0.230/6.221 secs] [Times: user=5.76 sys=8.55, real=6.22 secs] 
2016-12-29T22:44:47.699-0500: 27585.940: [CMS-concurrent-reset-start]
2016-12-29T22:44:47.717-0500: 27585.958: [GC (System.gc()) 2016-12-29T22:44:47.718-0500: 27585.959: [ParNew: 527384K->155025K(3774912K), 0.7351766 secs] 3405551K->3441841K(26843584K), 0.7366514 secs] [Times: user=5.61 sys=1.44, real=0.74 secs] 
2016-12-29T22:44:48.503-0500: 27586.744: [CMS-concurrent-reset: 0.049/0.804 secs] [Times: user=5.81 sys=1.45, real=0.81 secs] 

Кажется, что во время работы CMS происходит незначительное событие GC:

2016-12-29T22:44:41.618-0500: 27579.860: [GC (Allocation Failure) 2016-12-29T22:44:41.619-0500: 27579.860: [ParNew: 3579431K->419392K(3774912K), 5.7752364 secs] 6080306K->3302237K(26843584K), 5.7769753 secs] [Times: user=4.70 sys=8.50, real=5.78 secs] 

Это нормально? Младший GC блокирует полный GC?

Это может объяснить очень высокое системное время, которое мы наблюдаем? (sys=8,55 с, sys=8,50 с)

3 ответа

Решение

В вашем случае используются алгоритмы GC:

Параллельное Новое для Молодых + Параллельная Марка и Развертка (CMS) для Старого Поколения

Кажется, что во время работы CMS происходит небольшое событие GC. Это нормально?
Да, ParNew и CMS могут работать параллельно.

Младший GC блокирует полный GC?
Да, параллельная коллекция CMS "прерывается" второстепенными коллекциями ParNew. Коллекции молодого поколения могут происходить в любое время во время одновременного сбора старого поколения. В таком случае основная коллекция будет чередоваться с событиями Малой ГК

Это может объяснить очень высокое системное время, которое мы наблюдаем?
Вам необходимо проверить частоту и продолжительность событий "Останови мир" в ГХ.

  1. Начальная отметка CMS
  2. CMS Заключительное замечание
  3. ParNew

Просматривая ваш журнал, я могу определить, что ваш Minor GC (ParNew) занимает слишком много времени для завершения.
5.7752364 с. Время, затрачиваемое сборщиком мусора на разметку и копирование живых объектов в служебных данных связи Young Generation + с помощью сборщика ConcurrentMarkSweep

Хорошая ссылка на Java GC, стоит прочитать.

Конечно, молодые коллекции могут появляться во время старых коллекций. Обычно это не большая проблема, но в случае фазы замечаний CMS, следующей непосредственно за молодой коллекцией (или наоборот, поэтому обе эти паузы - это остановка мира), это может повредить производительности. CMS будет пытаться избежать этого, вычисляя, когда произойдет следующая молодая коллекция, но это только теория.

Это абсолютно нормально, если Young GC работает между фазами CMS. Выполнение молодой коллекции непосредственно перед начальной отметкой CMS или замечанием CMS может даже уменьшить "паузу в мире" основных GC.

Что НЕ нормально, так это большое системное время (процессорное время, затрачиваемое на ядро) при выполнении GC. Обычно этого не должно происходить, поскольку сборка мусора - это в основном работа в пользовательском пространстве.

Проверьте top, perfи т. д. чтобы найти причину высокого системного времени. Обычно это связано с проблемами с памятью: подкачка или дефрагментация прозрачных огромных страниц.

Другие вопросы по тегам