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

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

8 ответов

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

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

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

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

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

This article Memory Monitoring with Java SE 5 describes how to programmatically discover information on heap usage, memory pools (including permgen space) and so on. Its very simple:

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

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

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

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

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

Посмотрите мой пост в блоге про thm permsize из Eclipse

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

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

Посмотрите на код для 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, чтобы получить больше информации.

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

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

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

Таким образом, вы получите желаемое от " http://www.eclipse.org/mat/".

Удачи,

Другие вопросы по тегам