Дамп кучи 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 появляются в дампе кучи.