G1GC длинная пауза с начальной меткой

С j7u5, G1GC

"-Xms3200m -Xmx3200m -XX:+UseG1GC -XX:ParallelGCThreads=14 -XX:ConcGCThreads=4 -XX:MaxGCPauseMillis=40 -XX:NewRatio=2 -XX:SurvivorRatio=10 -XX:+PrintGC -XX:+PrintGCDateStamps"

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

Есть предложения выяснить, что происходит с этой длинной паузой и как ее настроить, чтобы избежать такой длинной паузы, которая влияет на целевые значения задержки (процентили 98%, 99,999%)?

2012-12-22T09:48:57.966+0000: [GC pause (young) 2436M->1460M(3200M), 0.0627090 secs]
2012-12-22T09:49:07.295+0000: [GC pause (young) 2458M->1481M(3200M), 0.0871760 secs]
2012-12-22T09:49:18.905+0000: [GC pause (young) 2479M->1503M(3200M), 0.0930280 secs]
2012-12-22T09:49:32.366+0000: [GC pause (young) 2501M->1524M(3200M), 0.0827900 secs]
2012-12-22T09:49:44.576+0000: [GC pause (young) (initial-mark) 2522M->1546M(3200M), 3.4979530 secs]
2012-12-22T09:49:48.074+0000: [GC concurrent-root-region-scan-start]
2012-12-22T09:49:48.079+0000: [GC concurrent-root-region-scan-end, 0.0056590]
2012-12-22T09:49:48.080+0000: [GC concurrent-mark-start]
2012-12-22T09:49:48.173+0000: [GC concurrent-mark-end, 0.0932560 sec]
2012-12-22T09:49:48.180+0000: [GC remark, 0.0470160 secs]
2012-12-22T09:49:48.232+0000: [GC cleanup 1585M->944M(3200M), 0.0180490 secs]
2012-12-22T09:49:48.251+0000: [GC concurrent-cleanup-start]
2012-12-22T09:49:48.255+0000: [GC concurrent-cleanup-end, 0.0047270]

person user1931506    schedule 27.12.2012    source источник
comment
Используйте значения параметров по умолчанию для большинства из них, за исключением целевого времени паузы, параллельных потоков gc и т. Д. G1gc работает лучше со значениями по умолчанию, как описано вначале выше.   -  person Ravindra babu    schedule 19.02.2016


Ответы (2)


для ведения журнала используйте -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime, чтобы лучше понять проблему и узкие места

Рекомендуется использовать -XX:+UnlockExperimentalVMOptions -XX:+AggressiveOpts -XX:+DoEscapeAnalysis -XX:+UseCompressedOops параметры с G1GC (если они поддерживаются собственным компьютером / сервером и версией JDK)

Также используйте -XX:GCPauseIntervalMillis=VALUE с комбинацией -XX:MaxGCPauseMillis=VALUE (он будет контролировать ваши паузы, лучше получить комбинацию наиболее подходящих значений обоих параметров, выполнив некоторые исследования и разработки) Кстати, мы успешно используя комбинацию значений как -XX: MaxGCPauseMillis = 400 -XX: GCPauseIntervalMillis = 8000

Значение по умолчанию для -XX:NewRatio param - 40, поэтому лучше иметь его 40 или более 40, например. -XX:NewRatio=50

person emkays    schedule 20.02.2013
comment
для получения информации об оптимальных настройках виртуальной машины см. stackoverflow.com/questions/2254041/ - person emkays; 20.08.2016

G1 GC - это адаптивный сборщик мусора со значениями по умолчанию, которые позволяют ему эффективно работать без изменений. Обратитесь к вопросу ниже для получения более подробной информации.

Java 7 (JDK 7) сборка мусора и документация по G1

Если вы будете следовать приведенным выше рекомендациям, рекомендованным oracle:

  1. Удалить ниже параметры

    -XX:SurvivorRatio=10 
    
  2. MaxGCPauseMillis=40 слишком агрессивен по сравнению с default value of 200 ms. Установите разумную цель по времени паузы.

  3. Измените -XX:ParallelGCThreads=14 -XX:ConcGCThreads=4 согласно рекомендации в зависимости от количества ядер ЦП на вашем сервере.

person Ravindra babu    schedule 19.02.2016