причины, по которым GcTimeLimit может не работать?

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

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

66872.846: [Full GC [PSYoungGen: 932534K->930686K(1865088K)] [PSOldGen: 5595037K->5595024K(5595136K)] 6527571K->6525710K(7460224K) [PSPermGen: 16488K->16487K(21504K)], 12.2488150 secs] [Times: user=12.25 sys=0.00, real=12.24 secs] 
66885.098: [Full GC [PSYoungGen: 932608K->932608K(1865088K)] [PSOldGen: 5595024K->5595024K(5595136K)] 6527632K->6527632K(7460224K) [PSPermGen: 16487K->16487K(21504K)], 9.6745600 secs] [Times: user=9.66 sys=0.01, real=9.67 secs] 
66894.773: [Full GC [PSYoungGen: 932608K->932488K(1865088K)] [PSOldGen: 5595024K->5595023K(5595136K)] 6527632K->6527512K(7460224K) [PSPermGen: 16487K->16487K(21504K)], 11.8445420 secs] [Times: user=11.85 sys=0.00, real=11.85 secs] 
66906.623: [Full GC [PSYoungGen: 932608K->932608K(1865088K)] [PSOldGen: 5595023K->5595023K(5595136K)] 6527631K->6527631K(7460224K) [PSPermGen: 16487K->16487K(21504K)], 9.6006950 secs] [Times: user=9.60 sys=0.00, real=9.60 secs] 
66916.224: [Full GC [PSYoungGen: 932608K->932488K(1865088K)] [PSOldGen: 5595023K->5595023K(5595136K)] 6527631K->6527512K(7460224K) [PSPermGen: 16487K->16487K(21504K)], 9.6498320 secs] [Times: user=9.65 sys=0.00, real=9.65 secs] 
66925.881: [Full GC [PSYoungGen: 932608K->0K(1865088K)] [PSOldGen: 5595023K->4133351K(5595136K)] 6527631K->4133351K(7460224K) [PSPermGen: 16487K->16487K(21504K)], 6.8990990 secs] [Times: user=6.90 sys=0.00, real=6.90 secs] 

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

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


person George    schedule 28.05.2010    source источник
comment
наблюдение - PermSpace выглядит совсем маленьким на 21 Мб и вообще не собирает. лучше бы с 128 или 256 работать?   -  person JoseK    schedule 30.05.2010


Ответы (1)


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

person Stephen C    schedule 28.05.2010