目前我正在尝试解决 Java 内存问题:
我的 Java 应用程序不断使用越来越多的内存
最终它被 Linux OOM 杀手杀死。
很可能是本地内存泄漏,因为经过检查
使用 VisualVM 的 JVM 的元空间和堆看起来都不错。
使用top命令我可以看到JVM使用的内存
持续增加。
本文中的第一张图:
例子#1
与我在自己的应用程序中看到的完美匹配。
因此,我尝试使用 JeMalloc 来查找泄漏,如各种文章中所述。
这里我遇到了一个问题:当使用 jeprof 命令及以后
jeprof 本身的 top 命令,它确实显示了使用的函数
最多的内存,但这些是十六进制地址,所以我必须
缺少一些符号。但我不知道我需要哪些软件包,这对我来说是未知的。
我已经找到这个链接:Link #1
并安装了这个包:
debuginfo-安装 java-1.8.0-openjdk
我首先尝试执行简单的步骤:
让 JeMalloc 与简单的应用程序一起使用,例如 w。
接下来让它与 java -version 一起使用。
到目前为止一切顺利,我还可以从 JeMalloc 获取具有完美概述的 PDF。
接下来让它与 java -jar simpletest.jar
接下来让它与 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
- JeMalloc
- OpenJDK
找到的文章:
第1条
文章#2
文章#3
文章#4