Причины, по которым GcTimeLimit может не выдавать ошибку?

У меня есть веб-сервис на Java, содержащийся в Jetty. Я использую Sun Java 6 с ParallelGC по умолчанию, и у меня включены следующие параметры командной строки: "-verbose:gc -XX:+PrintGCTimeStamps --XX:+PrintGCDetails".

Когда моему процессу не хватает памяти, я вижу логи, как это, спина к спине:

66872,846: [Полная GC [PSYoungGen: 932534K-> 930686K(1865088K)] [PSOldGen: 5595037K-> 5595024K (5595136K)] 6527571K-> 6525710K (7460224K) [PSPermGen: 1648K: 16482] 16487) Время: пользователь =12,25 сис = 0,00, реальное =12,24 с] 
66885.098: [Полный ГХ [PSYoungGen: 932608K->932608K(1865088K)] [PSOldGen: 5595024K-> 5595024K (5595136K)] 6527632K-> 6527632K (7460224K) [PSPermGen: 16487166: 16487]: 16487> 16487) Время: пользователь =9,66 сис = 0,01, реальное =9,67 с] 
66894,773: [Полный сборщик мусора [PSYoungGen: 932608K->932488K(1865088K)] [PSOldGen: 5595024K-> 5595023K (5595136K)] 6527632K-> 6527512K (7460224K) [PSPermGen: 16484] 16484] 16487] Время: пользователь =11,85 сис = 0,00, реальное =11,85 с] 
66906,623: [Полный GC [PSYoungGen: 932608K->932608K(1865088K)] [PSOldGen: 5595023K-> 5595023K (5595136K)] 6527631K-> 6527631K (7460224K) [PSPermGen: 16,450K> 16487> 16487) Время: пользователь =9,60 сис = 0,00, реальное =9,60 с] 
66916.224: [Полный GC [PSYoungGen: 932608K->932488K(1865088K)] [PSOldGen: 5595023K-> 5595023K (5595136K)] 6527631K-> 6527512K (7460224K) [PSPermGen: 16487K-> 16487K (21504K)], 9.6498320 сек] [ Время: пользователь =9,65 сис = 0,00, реальное =9,65 с] 
66925,881: [Полная GC [PSYoungGen: 932608K-> 0K (1865088K)]] [PSOldGen: 5595023K-> 4133351K (5595136K)] 6527631K-> 4133351K (7460224K) [PSPermGen: 16487K0,9990> 1699] 699,86> 169,899 6 166,80> 166,80> 166 099,80> 166 099,80> 166 099,80> 166 099,80> 6,999] 166,80> 6,999> 168> 699,86>> 6> 099 (0998) 099 (0998) 099 (-4): 0,999) 166,899 -> 168,899 -> 1699) - 16990: 699,899 -> 168, 0990: 699,899 -> 168, 0990: 699,899. Время: пользователь = 6,90 сис = 0,00, реальное = 6,90 с] 

Первые пять строк показывают, что сборщик мусора не может выполнить какой-либо прогресс. Согласно моему пониманию JVM, это должно привести к OutOfMemoryError, но я не вижу ничего подобного в журналах. Возможно ли, что что-то (на уровне JVM) мешает им быть брошенным? Или, может быть, Jetty или мое приложение подавляет их?

Спасибо за совет!

1 ответ

Попробуйте явно установить параметр или вместо него установить -XX:GCHeapFreeLimit. Документация для этих опций довольно тонкая и может не совсем отражать поведение JVM, которую вы используете. (Или, возможно, значения по умолчанию для соответствующих параметров изменились.)

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