Valgrind 和 Java

Posted

技术标签:

【中文标题】Valgrind 和 Java【英文标题】:Valgrind and Java 【发布时间】:2012-03-02 06:36:04 【问题描述】:

我想使用 Valgrind 3.7.0 来查找我的 Java 本机代码中的内存泄漏。我正在使用 jdk1.6.0._29。

为此,我必须设置 --trace-children=yes 标志。设置该标志后,我不再可以在任何 Java 应用程序上运行 valgrind,即使是这样的命令:

valgrind --trace-children=yes --smc-check=all java -version

会得到错误信息:

   Error occurred during initialization of VM
   Unknown x64 processor: SSE2 not supported

我看过这个链接:https://bugs.kde.org/show_bug.cgi?id=249943,但是没用。

在没有 Valgrind 或没有 --trace-children 标志的情况下运行程序很好。

有人知道我能做什么吗?

【问题讨论】:

【参考方案1】:

您必须禁用 JIT 才能在 valgrind 下运行 JVM,如下所示:

valgrind java -Djava.compiler=NONE ...

此外,如果您最终使用生成的抑制(而且您很可能会这样做!),则生成的抑制中调用堆栈的深度可能会出现问题,这在 JVM 下运行时更有可能发生。

在最新版本的 valgrind 中,生成的抑制可能包含比 valgrind/memcheck 本身处理的更深的调用堆栈。此问题的症状是 valgrind 意外终止并显示消息“堆栈跟踪中的调用者过多”。

这个问题很容易解决:在构建 valgrind 之前,编辑文件 coregrind/m_errormgr.c 并将#define 中的硬编码值更改为更大的值(我使用 99):

 /* Max number of callers for context in a suppression. */

 #define VG_MAX_SUPP_CALLERS  99

然后按照文档构建和安装 valgrind。

【讨论】:

在最新的 Valgrind 调用者限制设置为 500。【参考方案2】:

Valgrind 捕获并模拟(在一定程度上)处理器,这似乎导致 JVM 对您对 SSE 的支持和救助感到困惑

我建议您尝试告诉 JVM 不要打扰 SSE,您应该能够使用 JVM 标志 -XX:UseSSE=0 为热点关闭此功能@

祝你好运! valgrinding JVM 有点困难,因为它们彼此有些敌对

它也可能是你的 valgrind 和 java 版本我在本地运行你的命令并且没有问题,使用 valgrind 3.6.1 以及 java 1.6.0_26 和 java 1.7.0-b147

【讨论】:

-XX:UseSSE=0 很可能不再适用于 64 位硬件和操作系统上的当前版本的 JVM:// in 64 bit the use of SSE2 is the minimum if (UseSSE < 2) UseSSE = 2;blog.weghos.com/openjdk/OpenJDK/src/hotspot/cpu/x86/…

以上是关于Valgrind 和 Java的主要内容,如果未能解决你的问题,请参考以下文章

Valgrind

valgrind 工具介绍和简单的使用

valgrind定位内存问题

valgrind定位内存问题

Helgrind (Valgrind) 和 OpenMP (C):避免误报?

Valgrind错误在操作系统中有所不同