我怀疑我的java代码中存在本机内存泄漏。是否有任何工具可以进行本机内存分析?此外,是否有任何工具支持正在运行的java进程的本机内存分析?
谢谢!
编辑: 我已经尝试过Memory Validator和Purify,但似乎它们只支持32位进程。是否有一些类似于上述工具的工具可以简单地附加到正在运行的Windows进程并为该特定进程提供本机内存分析?
答案 0 :(得分:4)
Troubleshooting guide for Java SE 6 with Hotspot VM包含一个相当精细的部分,介绍有助于检测本机内存泄漏的技术。其中包括:
等。值得注意的是,该文章提到并非所有平台都存在理想的解决方案。
另外,请考虑使用大多数JVM中似乎可用的-Xcheck:jni
标志。 -X
标志本身表示该标志是非标准的,但该标志似乎在IBM JDK,Oracle 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 Studio或Memory 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/resources/native-memory-leak-hunting.png
答案 3 :(得分:0)
要诊断本机内存泄漏,需要使用JIT代码符号映射和Linux最近的概要分析工具:perf
,perf-map-agent
和bcc
。
请参阅相关答案https://stackoverflow.com/a/52767721/737790
中的详细信息非常感谢Brendan Gregg
答案 4 :(得分:0)
这些是您可以用于调试的工具
更多细节可以在这里找到 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