но должен быть адаптирован к контексту Java.
тоящее время я пытаюсь решить проблему с памятью Java: мое приложение Java продолжает использовать все больше и больше памяти, и в итоге оно убивается убийцей OOM Linux.
Вероятно, имеется утечка встроенной памяти, потому что после проверки JVM с VisualVM и метапространство, и куча выглядят нормально.
Используя команду top, я вижу, что память, используемая JVM, продолжает увеличиваться.
Первый рисунок в этой статье:
Это идеальное совпадение с тем, что я вижу в своем собственном приложении.
Поэтому я попытался использовать JeMalloc, чтобы найти утечку, как описано в различных статьях. Здесь я сталкиваюсь с проблемой: при использовании команды jeprof, а затем и самой верхней команды в самом jeprof, он показывает функции, которые используют больше всего памяти, но они в шестнадцатеричных адресах, поэтому я должен пропустить некоторые символы. Но я не знаю, какие пакеты мне нужны для этого, это мне неизвестно.
Я уже нашел эту ссылку:Ссылка № 1
И установил этот пакет: debuginfo-install java-1.8.0-openjdk
Сначала я попытался выполнить простые шаги:
Заставьте JeMalloc работать с простым приложением, таким как w. Затем заставьте его работать с Java-версией. Пока все хорошо, я также могу получить PDF от JeMalloc с отличным обзором.
Затем приведите его к работе с java -jar simpletest.jar << Здесь я пропускаю символы Например, если я не закрываю здесь GZipInputStream, это не отображается в результатах JeMalloc.
Затем настройте его на работу с java -jar myapplication.jar << Здесь также отсутствуют символы.
Итак, мой вопрос в основном: какие пакеты мне нужны, чтобы JeMalloc отображал все имена символов для отладки приложений, таких как:
public void test1() {
InputStream fileInputStream = null;
GZipInputStream gzipInputStream = null;
try {
fileInputStream = new FileInputStream("test.zip");
gzipInputStream = new GZIPInputStream(fileInputStream);
int data = gzipInputStream.read();
while (data != -1) {
// do something with data
data = gzipInputStream.read();
}
} catch (Exception ex) {
} finally {
// Disabled to see whether JeMalloc can detect the leak
/*try {
if (gzipInputStream != null) {
gzipInputStream.close();
}
if (fileInputStream != null) {
fileInputStream.close();
}
gzipInputStream = null;
fileInputStream = null;
} catch (IOException e) {
e.printStackTrace();
}*/
}
}
Используя следующее программное обеспечение:
Linux CentOS 7JeMallocOpenJDKНайдены статьи: