Дамп кучи Java включает потоковые стеки

Я использую инструмент анализа памяти Eclipse для изучения дампа кучи. Я не видел случаев, когда объект поддерживался локальной переменной в стеке потоков.

Сохраняются ли стеки потоков java в свалках кучи? Если нет, эти объекты считаются недостижимыми в дампе? Если да, существует ли способ сохранить стеки потоков, чтобы исключить ненужный мусор из локальных значений переменных?

Ответы

Ответ 1

Да

Кучи кучи из более поздней версии JVM (по состоянию на 2010 год) включали потоки потоков. Eclipse Memory Analyzer 0.8 (выпущен в январе 2010 года) включал поддержку для извлечения этой информации: http://www.eclipse.org/mat/0.8/noteworthy.html

Ответ 2

Трассировки стека не сохраняются, но ссылки на объекты в стеке сохраняются.

SELECT DISTINCT * FROM OBJECTS ( SELECT OBJECTS
${snapshot}.getOutboundReferentIds(thread.getObjectId())
FROM INSTANCEOF java.lang.Thread thread )

Этот OQL-запрос выбирает все объекты, на которые ссылаются потоки Java (java.lang.Thread и подклассы). Этот набор включает все локальные переменные Java вместе с любыми другими объектами, на которые ссылаются экземпляры Java-потока.

Ответ 3

Нет, потоки стека отделены от кучи кучи.

Как вы делаете свалки кучи? jmap? Если да, то по умолчанию удаляются только живые объекты. Это означает, что вы не увидите недостижимых объектов. Похоже, у вас утечка памяти или что-то в этом роде. Я бы рекомендовал использовать JVisualVM или более сложный профилировщик.

Ответ 4

объект, безусловно, доступен, даже если только одна локальная переменная ссылается на него. попробуйте следующее:

MyClass
    main
        obj = new ...
        obj.doSomethingThatTakes30Minutes()

obj shoudl появляются в дампе кучи.