9

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

谢谢!!

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

4

6 回答 6

4

带有 Hotspot VM的Java SE 6 故障排除指南包含相当详尽的部分,介绍了有助于检测本机内存泄漏的技术。这些包括:

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

其中。值得注意的是,文章提到没有适用于所有平台的理想解决方案。

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

于 2011-07-28T18:55:10.740 回答
2

AFAIK你不能使用 JProfiler、JVisualVM 等 Java 工具来做到这一点。如果本机代码中存在内存泄漏,请使用本机代码工具。你即。可以从 C 运行它(即加载 jvm.dll)。您可以查看这篇文章,使用 Visual StudioC++ (Linux) 中的内存泄漏检测来查找内存泄漏

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

于 2011-07-28T18:18:49.270 回答
1

我一直在开发一个名为“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

于 2016-07-09T13:19:59.317 回答
0

这些是可用于调试的工具

  1. libtcmalloc HPROF:用于堆分析
  2. jcmd 实用程序,该过程的 PSS:可以帮助确认本机泄漏。
  3. Native Memory Tracking:跟踪 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

于 2021-02-04T08:48:16.420 回答
0

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

请参阅相关答案中的详细信息https://stackoverflow.com/a/52767721/737790

非常感谢布伦丹·格雷格

于 2018-10-11T19:52:57.203 回答
-6

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

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

于 2011-07-28T18:09:52.667 回答