Ваше описание звучит как утечка памяти.В конце концов запускается ли сборщик мусора, или вы получаете OutOfMemoryError
?
Если вы этого не сделаете, то похоже, что вы попадаете в ситуацию, когда объекты живут достаточно долго, чтобы попасть вштатное поколение (я предполагаю, что Sun JVM здесь).И решение этой проблемы состоит в том, чтобы увеличить размер молодого поколения по сравнению с постоянным поколением.
Вот ссылка, которая объясняет сборщик поколений Sun JVM (это для 1.5 JVM, но я считаю, что варианты еще нетне изменился для 1.6): http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html
Варианты, с которыми вы хотели бы поэкспериментировать: NewRatio
, то есть отношение между молодым и постоянным поколением, и SurvivorRatio
, который является соотношениеммежду Эдемом и двумя местами выживших.Я мог бы попробовать следующее:
-XX:NewRatio=1
дает молодому поколению половину кучи объектов -XX:SurvivorRatio=2
делает каждое пространство выживших вдвое меньше, чем в Эдеме
Эти две настройки заставят пространство "Eden" для новых объектов занимать 1/4 кучи.Это довольно большой, так что, надеюсь, большинство объектов проведут всю свою жизнь в Эдеме.Рацион выживших дает еще 1/4 кучи пространствам для выживших (по 1/8 для каждого), чтобы удерживать объекты со средней продолжительностью жизни.
Конечно, не устанавливайте параметры вслепую.Вместо этого используйте jconsole
(часть дистрибутива JDK), чтобы увидеть, что на самом деле происходит с вашей кучей.Вы можете обнаружить, что коэффициент выживания по умолчанию (1: 6) лучше, чем я предлагал.