Java HotSpot 1.6 VM, Сборка мусора - Страшный PermGen - PullRequest
7 голосов
/ 11 мая 2010

Мое приложение показывает растущий размер «Старое поколение» / «Заемное поколение», и когда он достигает максимального предела для «Старого поколения», размер PermGen внезапно увеличивается. Вот размеры моего поколения:

-Xmx1200m -Xms1200m -Xmn450m -XX:MaxPermSize=600m -XX:+UseParallelGC

Это на 32-битной Fedora, поэтому не может быть больше, чем эта.

Приложение не выполняет какой-либо сложной загрузки классов, хотя использует Spring IOC и Hibernate, Spring App-context.xml определяет около 1000 Beans.

Это приложение запускается с 175 МБ PermGen, который постоянно увеличивается до ~ 250 МБ в течение нескольких часов, остается таким до тех пор, пока Tenured Generation не достигнет ~ 780 МБ, затем permgen скачет до ~ 500 МБ, а Old Gen упадет до ~ 500 МБ.

Это вынуждает меня перезапускать приложение ежедневно и дает мне реальный страх перед надвигающейся ошибкой OutOfMemory. Любое понимание было бы очень полезно.

Спасибо Gala101

13 / Май: Может, кто-нибудь пролил свет на то, что происходит, когда «Старый Генерал» собирает мусор?
Размещает ли jvm коллекции из 'Old Gen' в PermGen?
Мой всплеск PermGen приходит только тогда, когда происходит сбор из 'Old Gen', также уменьшение размера OldGen близко соответствует увеличению размера PermGen.
PS: я не делаю развертывания / отмены развертывания в режиме реального времени, так как это наверняка поглотит PermGen.
Ниже приведен текущий снимок с моей страницы мониторинга: (обязательная часть только что перепрыгнула с ~ 250 МБ до 500 МБ)

    PS Perm Gen
Type    Non-heap memory
Usage   init = 16777216(16384K) used = 254453736(248489K) committed = 504954880(493120K) max = 629145600(614400K)
Peak Usage  init = 16777216(16384K) used = 254453736(248489K) committed = 504954880(493120K) max = 629145600(614400K)
Collection Usage    init = 16777216(16384K) used = 252421536(246505K) committed = 504954880(493120K) max = 629145600(614400K)

Ответы [ 3 ]

2 голосов
/ 13 мая 2010

Я бы последовал совету Леонма, чтобы проанализировать, что занимает столько памяти. Могу поспорить, у вас какая-то неприятная утечка памяти.

Вы говорите, что не делаете какой-либо необычной загрузки классов, но Hibernate генерирует некоторые классы на лету для вас. Используете ли вы некоторые функции AOP (например, из модуля Spring AOP?).

По сути, если у вас заканчивается пространство PermGen, то кажется, что ваше приложение продолжает создавать новые классы (поскольку это классы, которые хранятся в PermGen).

0 голосов
/ 13 мая 2010

Permgen становится утекшим, если вы продолжаете развертывать / отменять развертывание приложений на сервере приложений.

Проверьте эту ссылку для более подробного объяснения того, что это не ошибка сервера приложений.

http://blogs.oracle.com/fkieviet/entry/classloader_leaks_the_dreaded_java

0 голосов
/ 11 мая 2010

Используйте jmap для создания дампа памяти перед перезапуском сервера и проанализируйте с помощью Eclipse MAT

...