Как мне узнать, что находится в постоянном поколении - PullRequest
11 голосов
/ 11 октября 2008

При наличии heapdump или работающей виртуальной машины, как мне узнать, что такое содержимое постоянного поколения? Я знаю о jmap -permstat, но он недоступен в Windows.

Ответы [ 8 ]

1 голос
/ 12 октября 2008

Постоянное поколение содержит объект класса. Поэтому вы должны проверить дамп кучи или другую форму списка объектов для классов. Если у вас есть проблема с размером постоянного поколения, обычно это вызвано двумя причинами:

  • ваша программа или используемая вами библиотека динамически создают классы, а размер постоянной генерации по умолчанию слишком мал - просто увеличьте размер с помощью -XX: MaxPermSize = 256m
  • ваша программа или используемая вами библиотека динамически создают новые классы при каждом вызове, поэтому размер постоянной генерации увеличивается без перерыва - это ошибка программирования, которую следует исправить (или выполнить поиск исправления / создать отчет об ошибке) )

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

И хороший обзор о постоянном поколении:

http://blogs.oracle.com/jonthecollector/entry/presenting_the_permanent_generation

1 голос
/ 22 декабря 2011

Эта статья Мониторинг памяти с помощью Java SE 5 описывает, как программно обнаруживать информацию об использовании кучи, пулах памяти (включая пространство permgen) и так далее. Это очень просто:

    MemoryUsage usage = ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage();
    long nonHeapFree = usage.getMax() - usage.getUsed();
    long nonHeapTotal = usage.getMax();

В моем тестировании на OSX (Sun VM) «использование памяти без кучи» полностью совпадает со значениями, возвращаемыми для пула permgen, и, вероятно, будет полезно для виртуальных машин, которые не имеют permgen.

0 голосов
/ 29 сентября 2015

Одна техника, которая помогла мне, состояла в том, чтобы использовать параметр командной строки -verbose:class для java , и вы получите вывод журнала, сообщающий, как классы загружаются / выгружаются. Поскольку классы загружаются в permgen, это может помочь при определенных обстоятельствах.

0 голосов
/ 17 ноября 2011

Я смотрю на то же самое, но из-за ограничений памяти встроенной платформы.

Посмотрите на код jmap, инструмент permstat доступен только в том случае, если доступен класс sun.jvm.hotspot.tools.HeapSummary. Этот класс является частью агента по исправности. Согласно документации OpenJDK (http://openjdk.java.net/groups/serviceability/svcjdk.html#bsa):

Компоненты Serviceability Agent создаются как часть стандартной сборки репозитория HotSpot. Эти компоненты:

-libsaproc.so: это компонент собственного кода SA.

-sa-jdi.jar: содержит классы Java SA. Он включает в себя реализацию JDI, которая позволяет клиентам JDI выполнять отладку только для чтения для основных файлов и зависших процессов.

SA используется jinfo, jmap, jstack

ПРИМЕЧАНИЕ. Агент Serviceability Agent и технологии, которые его используют, в настоящее время не включены в выпуски JDK на платформах Windows.

Похоже, дело в Oracle JDK. Я хочу изменить инструмент jmap, чтобы получить больше информации.

0 голосов
/ 15 мая 2009

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

В отличие от названия, permgen в конечном итоге тоже получает GC, но не входит в обычный цикл GC. Следовательно, несвязанные интернированные строки и неиспользуемые классы очищаются. Но permgen также не растет динамически, что означает, что иногда необходимо вручную изменить его настройки для запуска JVM.

0 голосов
/ 14 мая 2009

У вас есть конкретная проблема, которую нужно решить? Использование String.intern () является одной из типичных причин проблем с permgen. Кроме того, проекты с большим количеством классов также имеют проблемы с permgen.

Я не знаю, как попасть в Пермген и посмотреть, что там есть ...

0 голосов
/ 24 ноября 2008

Смотрите мой блог о thr permsize Eclipse

Короче говоря, анализатор памяти может это делать, но вам нужна SAP JVM.

0 голосов
/ 11 октября 2008

вы можете использовать JConsole или jvisualvm.exe (с jdk 1.6 7), чтобы найти, что находится где. Если вы хотите узнать, как все ваши объекты связаны друг с другом и деревом объектов, то вы можете попробовать Eclipse Memory Analyzer - http://www.eclipse.org/mat/.

В итоге вы получите желаемое от "http://www.eclipse.org/mat/".

Удачи,

...