用于本机内存泄漏分析的工具

时间:2011-07-28 17:55:18

标签: java memory-leaks native-code

我怀疑我的java代码中存在本机内存泄漏。是否有任何工具可以进行本机内存分析?此外,是否有任何工具支持正在运行的java进程的本机内存分析?

谢谢!

编辑: 我已经尝试过Memory Validator和Purify,但似乎它们只支持32位进程。是否有一些类似于上述工具的工具可以简单地附加到正在运行的Windows进程并为该特定进程提供本机内存分析?

6 个答案:

答案 0 :(得分:4)

Troubleshooting guide for Java SE 6 with Hotspot VM包含一个相当精细的部分,介绍有助于检测本机内存泄漏的技术。其中包括:

  • 包装所有内存分配和释放调用以跟踪使用的内存量。
  • 依赖于平台特定的支持,例如Microsoft Visual C ++编译器提供的调试支持,或者依赖于mtrace(和MALLOC_TRACE)来调试Linux上的内存分配。
  • 使用Rational Purify等内存泄漏分析工具。

等。值得注意的是,该文章提到并非所有平台都存在理想的解决方案。

另外,请考虑使用大多数JVM中似乎可用的-Xcheck:jni标志。 -X标志本身表示该标志是非标准的,但该标志似乎在IBM JDKOracle JRockit R28甚至Oracle / Sun JVM中可用。启用标志会在JNI调用周围添加包装器的模式下切换,从而允许您跟踪传递给JVM调用的非法参数,如JNI programmers' guide and specification中所述。虽然它用于检测内存泄漏是主观的,但如果您怀疑泄漏是由于发出无效参数引起的,那肯定会有所帮助。

答案 1 :(得分:2)

AFAIK 你无法使用JProfiler,JVisualVM等Java工具。如果本机代码中存在内存泄漏,请使用本机代码工具。你是的。可以从C运行它(即加载jvm.dll)。您可以查看这些文章finding memory leaks using Visual StudioMemory Leak Detection in C++ (Linux)

注意:当然如果泄漏与堆泄漏相关(忘记了deleteglobalref),您可以使用Java工具找到它,但在JNI中这种情况非常罕见。

答案 2 :(得分:1)

我一直致力于一个名为" MySafe"的开源项目。 (https://github.com/serkan-ozal/mysafe)它基本上拦截和监视"不安全"调用。 (事实上​​,它超过了)。使用2.0版本,它可用于跟踪和检测"不安全"基于本机内存泄漏。

演示代码:https://github.com/serkan-ozal/mysafe/blob/master/src/test/java/tr/com/serkanozal/mysafe/NativeMemoryLeakHuntingDemo.java

显示泄漏源的图表:https://github.com/serkan-ozal/mysafe/blob/master/src/test/resources/native-memory-leak-hunting.png

答案 3 :(得分:0)

要诊断本机内存泄漏,需要使用JIT代码符号映射和Linux最近的概要分析工具:perfperf-map-agentbcc

请参阅相关答案https://stackoverflow.com/a/52767721/737790

中的详细信息

非常感谢Brendan Gregg

答案 4 :(得分:0)

这些是您可以用于调试的工具

  1. libtcmalloc HPROF:用于堆分析
  2. 进程的 jcmd 实用程序、PSS:可以帮助确认本机泄漏。
  3. 本机内存跟踪:跟踪 JVM 中的本机内存泄漏(仅适用于 JVM 内的分配)
  4. 核心转储分析、pmap 和 gdb 检查匿名块和进程内存超时
  5. -Xcheck:jni

更多细节可以在这里找到 https://bro-code.in/2020/04/17/debug-java-native-memory-leaks/ http://www.oracle.com/technetwork/java/javase/memleaks-137499.html#gbyvk

答案 5 :(得分:-6)

我是JProfiler的忠实粉丝。这是分析和内存泄漏的最佳工具。相对于大多数工具而言,它相当便宜,非常容易学习,而且功能很多。

http://www.ej-technologies.com/products/jprofiler/overview.html