目前我正在尝试解决 Java 内存问题:我的 Java 应用程序不断使用越来越多的内存,最终它被 Linux OOM 杀手杀死。
可能存在本机内存泄漏,因为在使用 VisualVM 检查 JVM 后,元空间和堆看起来都正常。
使用 top 命令我可以看到 JVM 使用的内存不断增加。
本文第一张图:
与我在自己的应用程序中看到的完美匹配。
所以我尝试使用 JeMalloc 来查找各种文章中描述的泄漏。在这里我遇到了一个问题:当使用 jeprof 命令和后来的 jeprof 本身的 top 命令时,它确实显示了使用最多内存的函数,但是这些都是十六进制地址,所以我必须遗漏一些符号。但我不知道我需要哪些包,这对我来说是未知的。
我已经找到了这个链接: Link #1
并安装了这个包:debuginfo-install java-1.8.0-openjdk
我尝试先完成简单的步骤:
让 JeMalloc 与一个简单的应用程序一起工作,例如 w。接下来让它与 java -version 一起工作。到目前为止一切顺利,我还可以从 JeMalloc 获得 PDF,并提供完美的概述。
接下来让它与 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 7
- 杰马洛克
- OpenJDK
找到的文章: