【问题标题】:Tools for native memory leak analysis本机内存泄漏分析工具
【发布时间】:2011-10-15 08:40:08
【问题描述】:

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

谢谢!!

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

【问题讨论】:

    标签: java memory-leaks native-code


    【解决方案1】:

    这些是可用于调试的工具

    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

    【讨论】:

      【解决方案2】:

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

      详情请参考相关答案https://stackoverflow.com/a/52767721/737790

      非常感谢Brendan Gregg

      【讨论】:

        【解决方案3】:

        我一直在做一个名为“MySafe”(https://github.com/serkan-ozal/mysafe)的开源项目,它主要拦截和监控“Unsafe”调用。 (事实上​​,它使更多)。在 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

        【讨论】:

          【解决方案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 中所述。虽然它用于检测内存泄漏是主观的,但如果您怀疑泄漏是由于发出的无效参数引起的,它肯定会有所帮助。

          【讨论】:

            【解决方案5】:

            AFAIK 您不能使用 JProfiler、JVisualVM 等 Java 工具来做到这一点。如果您在本机代码中存在内存泄漏,请使用本机代码工具。你即。可以从 C 运行它(即加载 jvm.dll)。可以看这篇文章finding memory leaks using Visual Studio或者Memory Leak Detection in C++ (Linux)

            注意:当然如果你的泄漏与堆泄漏有关(忘了deleteglobalref)你可以用Java工具找到它,但在JNI中很少见。

            【讨论】:

              【解决方案6】:

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

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

              【讨论】:

              • JProfiler 是一个很好的分析器,它还允许跟踪对象的创建。但这与本机堆分配无关。
              猜你喜欢
              • 1970-01-01
              • 2013-05-24
              • 1970-01-01
              • 2011-01-07
              • 2012-05-09
              • 1970-01-01
              • 2016-04-02
              • 1970-01-01
              • 2014-12-08
              相关资源
              最近更新 更多