Параллельные провалы промоушена... В чем причина?
Я запускаю Java-программу, используя пространство кучи 3GB. Через некоторое время я замечаю это в логах gc.
Время нанесения: 0,8263100 секунд
2015-03-13T07:24:49.065-0700: 77177.620: [GC Before GC:
Статистика для BinaryTreeDictionary:
Всего свободного места: 2960457
Максимальный размер куска: 1233864
Количество блоков: 393
Средний. Размер блока: 7532
Высота дерева: 19
До GC:
Статистика для BinaryTreeDictionary:
Всего свободного места: 0
Максимальный размер куска: 0
Количество блоков: 0
Высота дерева: 0
77177.620: [ParNew (0: размер ошибки продвижения = 2154) (1: размер ошибки продвижения = 2154) (2: размер ошибки продвижения = 2154) (3: размер ошибки продвижения = 2154) (4: размер ошибки продвижения = 2154) (5: размер ошибки продвижения = 2154) (6: размер ошибки продвижения = 2154) (7: размер ошибки продвижения = 2154) (8: размер ошибки продвижения = 2154) (10: размер ошибки продвижения = 2154) (11: размер ошибки продвижения = 2154) (12: размер ошибки продвижения = 2154) (13: размер ошибки продвижения = 2154) (14: размер ошибки продвижения = 2154) (15: размер ошибки продвижения = 2154) (16: размер ошибки продвижения = 2154) (17: размер ошибки продвижения = 2154) (18: размер ошибки продвижения = 2154) (19: размер ошибки продвижения = 2154) (20: размер ошибки продвижения = 2154) (21: размер ошибки продвижения = 2154) (22: размер ошибки продвижения = 2154) (23: размер ошибки продвижения = 2154) (24: размер ошибки продвижения = 2154) (25: размер ошибки продвижения = 2154) (26: размер ошибки продвижения = 2154) (27: размер ошибки продвижения = 2154) (ошибка продвижения): 346350K->333366K(393216K), 0,3779580 с]77177,998: [CMSCMS: большой блок 0x00000007b7da3200
: 2156277K-> 1695244K (2621440K), 11,2619970 с] 2481226K->1695244K(3014656K), [CMS Perm: 193077K->191199K(256000K)] После ГХ:
Статистика для BinaryTreeDictionary:
Всего свободного места: 118536640
Максимальный размер куска: 118536640
Количество блоков: 1
Средний. Размер блока: 118536640
Высота дерева: 1
После GC:
Статистика для BinaryTreeDictionary:
Всего свободного места: 0
Максимальный размер куска: 0
Количество блоков: 0
Высота дерева: 0
, 11,6404220 секунд] [Время: пользователь = 16,85 сис = 0,04, реальное = 11,64 с]
Общее время, в течение которого потоки приложения были остановлены: 11,6432380 секунд
Время применения: 0,0421420 секунд
Общее время, в течение которого потоки приложения были остановлены: 0,0189740 секунд.
Из-за этого Full GC моя программа была остановлена на 11 секунд. Это вызвало огромную проблему с производительностью. Дело в том, что везде люди говорят [провал промоушена = фрагментация]. Если это так, то почему максимальный размер куска (1233864) до GC все же больше, чем все размеры блока сбоев продвижения (2154) вместе взятых.
Я проверил всюду и не смог найти причину этой проблемы.
Кто-нибудь здесь знает причину, почему это происходит?
1 ответ
Самое большое беспокойство при использовании этого сборщика - это неудачные промоушены, которые являются причиной расы между сбором молодого и старого поколений. Если сборщик должен продвигать молодые объекты старому поколению, но у него не было достаточно времени, чтобы освободить место, он должен сделать это в первую очередь, что приведет к полной коллекции STW - именно то, для чего предназначен этот сборщик CMS предотвращать. Чтобы этого не произошло, вы должны либо увеличить размер старого поколения (или всей кучи в этом отношении), либо выделить больше фоновых потоков для коллектора, чтобы он мог конкурировать со скоростью выделения объектов.