首页 > 解决方案 > 将本机函数调用关联到 Java 方法

问题描述

我们遇到了 Java 进程的本机内存泄漏问题。

在按照许多资源(如(http://www.evanjones.ca/java-native-leak-bug.html)的建议将 JVM 与 jemalloc 链接后,我们能够将根本原因归结为 zlib 中的 inflateInit2_ 和 updatewindow 调用图书馆。

我们如何将这些来自 Native 空间的调用关联到 JVM 方法?我们已经尝试查看堆栈跟踪(希望幸运)和火焰图,但这些并没有太大帮助。

标签: javajvmnative

解决方案


ZipInputStream/JarInputStream是此类内存泄漏的典型来源,例如,当 aClass.getResourceAsStream使用后未关闭时。

创建堆转储以查看谁持有java.util.zip.Inflater对象。


async-profiler最近获得了对在 Linux 上分析本机内存泄漏的支持。以下命令将在<SEC>几秒钟内分析原生分配,并创建一个包含组合 Java+原生堆栈的 FlameGraph 报告:

./profiler.sh -e malloc -d <SEC> -o malloc.svg <PID>

推荐阅读