Я изучаю потенциальную утечку памяти (или, по крайней мере, отходы памяти) в довольно большой системе на основе Java. JVM работает с максимальным размером кучи 5 ГБ, а использование кучи на 2-3 ГБ является ожидаемой базовой линией для приложения. (Там могут быть пики, которые выше)
В сценарии перегрузки, который я изучаю, куча заполняется. Анализ кучи-дампа с помощью инструмента "Eclipse MemoryAnalyzer" показывает (неудивительно), что куча полностью израсходована.
MAT показывает 2 потенциальных кандидата на утечку, которые примерно сохраняют 2,5 ГБ: java.lang.Thread и объект домена из системы, который широко используется при обработке транзакций в системе. Однако все эти объекты домена (не удивительно) доступны из экземпляров Thread. В конце концов, эти потоки обрабатывают транзакции. Таким образом, 2,5 ГБ приписывается java.lang.Thread почти полностью вызван этими объектами домена. Здесь нет ничего удивительного.
Листинг дерева объектов для всех экземпляров java.lang.Thread и суммирования сохраненной кучи всех потоков приводит к 2,5 ГБ сохраненной кучи.
Где я должен искать другие 2,5 ГБ, которые необходимы для заполнения кучи, если они недоступны из экземпляра java.lang.Thread? - В очереди финализатора ничего нет - В ожидании GC
отсутствует значительное количество недостижимых объектов.Я думаю, что еще один способ поставить этот вопрос: "Как найти все объекты, недоступные из экземпляра java.lang.Thread? Возможно, запрос OQL?" и другой вопрос: "Какие объекты есть ли недоступные из экземпляра java.lang.Thread, а затем объекты в очереди Finalizer и объекты без ссылок в ожидании GC?"