В настоящее время я пытаюсь решить проблему с памятью Java: мое приложение Java продолжает использовать все больше и больше памяти, и в конечном итоге оно уничтожается убийцей OOM Linux.
Возможно, имеется утечка встроенной памяти, посколькупроверка JVM с помощью VisualVM и метапространства, и кучи выглядят хорошо.
Используя команду top, я вижу, что память, используемая JVM, продолжает увеличиваться.
Первый рисунок в этой статье:
Пример # 1
Идеально соответствует тому, что я вижу в своем собственном приложении.
Поэтому я попытался с помощью JeMalloc найти утечку, как описано в различных статьях.Здесь я сталкиваюсь с проблемой: при использовании команды jeprof, а затем и самой верхней команды в самом jeprof, он показывает функции, которые используют больше всего памяти, но они в шестнадцатеричных адресах, поэтому я должен пропустить некоторые символы.Но я не знаю, какие пакеты мне нужны для этого, что мне неизвестно.
Я уже нашел эту ссылку: Ссылка # 1
И установил этот пакет:debuginfo-install java-1.8.0-openjdk
Сначала я попытался выполнить простые шаги:
Получить JeMalloc для работы с простым приложением, таким как w.Затем заставьте его работать с Java-версией.Пока все хорошо, я также могу получить PDF-файлы от JeMalloc с отличным обзором.
Далее заставьте его работать с java -jar simpletest.jar << Здесь я пропускаю символы Например, если я не закрываюздесь GZipInputStream, который не отображается в результатах JeMalloc. </p>
Далее заставьте его работать с java -jar myapplication.jar << Здесь я также пропускаю символы. </p>
Так что мойВопрос в основном: какие пакеты мне нужны, чтобы 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();
}*/
}
}
Использование следующего программного обеспечения:
- LinuxCentOS 7
- JeMalloc
- OpenJDK
Найдено статей:
Артикул 1
Артикул № 2
Артикул № 3
Артикул № 4