2010-11-01 2 views
7
  1. Есть ли способ измерить размер постоянного поколения (PermGen) в моем приложении Java? Я не могу использовать внешние инструменты для профилирования, такие как VisualVM.Как определить размер PermGen в приложении Java (т. Е. Программно)?

  2. Еще лучше было бы оценить потребление памяти класса Java в PermGen. Он почти пропорционален размеру файла байткода?

ответ

9

Вы можете использовать MemoryMXBean, который поставляется с JDK. Но я не думаю, что есть способ запросить использование permgen из работающего приложения. Документы о MemoryMXBean.

+0

Спасибо! Этот ответ мне очень помог. Я буду голосовать за ваш ответ полезным, как только у меня хватит репутации! :) – s106mo

0

Размер PermGen не имеет никакого отношения к размеру ваших файлов классов. По умолчанию размер PermGen в соответствии с Sun составляет 64 МБ. Если вы хотите его увеличить, вы можете установить его явно, используя:

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

EDIT:

Прочитайте эту статью, чтобы определить, сколько примерно PermGen в настоящее время используется программно (т.е. без внешних инструментов):

http://frankkieviet.blogspot.com/2006/10/how-to-fix-dreaded-permgen-space.html

+0

The * максимальный размер * не обязательно иметь ничего делать с размером любого файла. Но stefan ищет текущий (использованный) размер, а не максимальный размер. –

+0

Согласно http://blogs.sun.com/jonthecollector/entry/presenting_the_permanent_generation, например. байт-коды методов класса влияют на размер PermGen! – s106mo

+0

Я не указывал максимальный размер. Флаг для максимального размера perm - MaxPermSize –

2

Вы можете использовать jvisualvm инструмент из JDK с Visual GC плагин для мониторинга всех областей кучи JVM, включая PermGen.

2

Если вы не в Windows, вы можете попробовать jmap, который поставляется вместе с JDK.

+0

К сожалению, я должен сделать это на Windows ... спасибо в любом случае! – s106mo

1

Вы можете использовать jmap команды:

jmap [опция] (для подключения к процессу запуска)

jmap [опция] (для подключения к основному файлу)

jmap [option] [server_id @] (для подключения к удаленному серверу отладки)

где опции является одним из:

-heap: напечатать РЕЗЮМЕ Java Heap

-permstat: печатать статистику постоянного поколения

+0

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