我怀疑我的 java 代码中存在本机内存泄漏。是否有任何工具可以进行本机内存分析?此外,是否有任何工具支持正在运行的 java 进程的本机内存分析?
谢谢!!
编辑:我已经尝试过 Memory Validator 和 Purify,但它们似乎只支持 32 位进程。是否有一些类似于上述工具的工具可以简单地附加到正在运行的 Windows 进程并为我们提供该特定进程的本机内存分析?
我怀疑我的 java 代码中存在本机内存泄漏。是否有任何工具可以进行本机内存分析?此外,是否有任何工具支持正在运行的 java 进程的本机内存分析?
谢谢!!
编辑:我已经尝试过 Memory Validator 和 Purify,但它们似乎只支持 32 位进程。是否有一些类似于上述工具的工具可以简单地附加到正在运行的 Windows 进程并为我们提供该特定进程的本机内存分析?
带有 Hotspot VM的Java SE 6 故障排除指南包含相当详尽的部分,介绍了有助于检测本机内存泄漏的技术。这些包括:
其中。值得注意的是,文章提到没有适用于所有平台的理想解决方案。
此外,请考虑使用-Xcheck:jni
在大多数 JVM 中似乎可用的标志。该-X
标志本身表明该标志是非标准的,但该标志似乎在IBM JDK、Oracle JRockit R28甚至 Oracle/Sun JVM 中可用。启用该标志会打开在 JNI 调用周围添加包装器的模式,从而允许您跟踪传递给 JVM 调用的非法参数,如JNI 程序员指南和规范中所述。虽然它用于检测内存泄漏是主观的,但如果您怀疑泄漏是由于发出的无效参数引起的,它肯定会有所帮助。
AFAIK你不能使用 JProfiler、JVisualVM 等 Java 工具来做到这一点。如果本机代码中存在内存泄漏,请使用本机代码工具。你即。可以从 C 运行它(即加载 jvm.dll)。您可以查看这篇文章,使用 Visual Studio或C++ (Linux) 中的内存泄漏检测来查找内存泄漏
注意:当然如果你的泄漏与堆泄漏有关(忘了deleteglobalref)你可以用Java工具找到它,但在JNI中很少见。
我一直在开发一个名为“MySafe”(https://github.com/serkan-ozal/mysafe)的开源项目,它基本上拦截和监控“Unsafe”调用。(事实上,它使更多)。在 2.0 版中,它可用于跟踪和检测基于“不安全”的本机内存泄漏。
显示泄漏源的图表:https ://github.com/serkan-ozal/mysafe/blob/master/src/test/resources/native-memory-leak-hunting.png
这些是可用于调试的工具
更多细节可以在这里找到 https://bro-code.in/2020/04/17/debug-java-native-memory-leaks/ http://www.oracle.com/technetwork/java/javase/memleaks -137499.html#gbyvk
要诊断本机内存泄漏,需要 JIT 代码符号映射和 Linux 最近的分析工具perf
:perf-map-agent
和bcc
.
请参阅相关答案中的详细信息https://stackoverflow.com/a/52767721/737790
非常感谢布伦丹·格雷格
我是 JProfiler 的忠实粉丝。这是分析和内存泄漏的最佳工具。相对于大多数工具来说,它相当便宜,非常容易学习,而且功能很多。
http://www.ej-technologies.com/products/jprofiler/overview.html