Как узнать, что находится в постоянном поколении

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

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

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

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

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

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

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

Выглядит так же и для Oracle JDK. Я хочу изменить инструмент jmap, чтобы получить дополнительную информацию.

Ответ 7

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

Ответ 8

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

В заключение вы получите желание, которое хотите от " http://www.eclipse.org/mat/".

Удачи,