Я испытываю утечку памяти, и здесь идет некоторая деталь.
Во время утечки,
- топ показывает 50 ГБ памяти как жилой
- Размер файла дампа кучи составляет 25 ГБ
- Анализатор Eclipse MAT говорит мне, что размер кучи составляет 10 ГБ
Во время до утечки,
- верхняя показывает 30 ГБ памяти как жилой
- Размер файла дампа кучи составляет 20 ГБ
- Анализатор Eclipse MAT говорит мне, что размер кучи составляет 10 ГБ
Я очень удивлен, что разница между верхом, размером дампа кучи и фактическим размером кучи. Я предполагаю, что разница между вершиной и кучей заключается в возможности кучи сборщика мусора и областей собственной кучи. Но почему размер файла дампа кучи и фактический размер кучи (из анализатора eclipse MAT) могут отличаться?
Любое понимание этой проблемы?
ОБНОВЛЕНИЕ/ОТВЕТ
Некоторые из предложений заключаются в том, чтобы использовать jcmd (https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html), поскольку веб-сайт сообщает "Отслеживание встроенной памяти". Но, если вы внимательно прочитаете страницу, вы увидите
Поскольку NMT не отслеживает распределение памяти по коду, отличному от JVM, вам, возможно, придется использовать инструменты, поддерживаемые операционной системой, для обнаружения утечек памяти в собственном коде.
Так что, в случае утечки внутри собственной библиотеки, jcmd не вариант.
После нескольких дней сканирования Интернета и опробования различных профилировщиков наиболее эффективным для этой проблемы является использование профилировщика jemalloc.
Эта страница мне очень помогла! https://gdstechnology.blog.gov.uk/2015/12/11/using-jemalloc-to-get-to-the-bottom-of-a-memory-leak/