Valgrind和Java
我想使用Valgrind 3.7.0查找Java本机代码中的内存泄漏。我正在使用jdk1.6.0 为此,我必须设置--trace children=yes标志。设置该标志后,我再也不能在任何java应用程序上运行valgrind,即使是以下命令:Valgrind和Java,java,memory-leaks,java-native-interface,valgrind,sse2,Java,Memory Leaks,Java Native Interface,Valgrind,Sse2,我想使用Valgrind 3.7.0查找Java本机代码中的内存泄漏。我正在使用jdk1.6.0 为此,我必须设置--trace children=yes标志。设置该标志后,我再也不能在任何java应用程序上运行valgrind,即使是以下命令: valgrind --trace-children=yes --smc-check=all java -version 将获取错误消息: Error occurred during initialization of VM Unknown
valgrind --trace-children=yes --smc-check=all java -version
将获取错误消息:
Error occurred during initialization of VM
Unknown x64 processor: SSE2 not supported
我看到了这个链接:,但它没有用
在没有Valgrind或--trace children标志的情况下运行程序是可以的
有人知道我能做什么吗?Valgrind捕获并模拟(在一定程度上)处理器,这似乎导致JVM对您对SSE的支持和退出感到困惑 我建议您尝试告诉JVM不要为SSE操心,您应该能够使用JVM标志
-XX:UseSSE=0
祝你好运!对JVM的访问有点困难,因为它们之间有点敌对
它也可能是您的valgrind和java版本。我从上面本地运行了您的命令,使用valgrind 3.6.1以及java 1.6.026和java 1.7.0-b147,没有问题,您必须禁用JIT才能在valgrind下运行JVM,如下所示:
valgrind java -Djava.compiler=NONE ...
此外,如果最终使用生成的抑制(而且很可能会!),则生成的抑制中的调用堆栈深度可能会出现问题,在JVM下运行时更可能出现这种情况
在valgrind的最新版本中,生成的抑制可能包含比valgrind/memcheck本身能够处理的调用堆栈更深的调用堆栈。此问题的症状是valgrind意外终止,并显示消息“堆栈跟踪中的调用方太多”
这个问题很容易解决:在构建valgrind之前,编辑文件coregrind/m#u errormgr.c,并将#define中的硬编码值更改为更大的值(我使用99):
然后根据文档构建并安装valgrind。在最新版本中,valgrind调用者限制设置为500。
/* Max number of callers for context in a suppression. */
#define VG_MAX_SUPP_CALLERS 99