Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Valgrind和Java_Java_Memory Leaks_Java Native Interface_Valgrind_Sse2 - Fatal编程技术网

Valgrind和Java

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 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 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