2009-01-16 79 views
5

在valgrind下运行时,太阳JVM吐出大量额外的噪音,这使得跟踪应用程序中的内存问题非常具有挑战性。在Valgrind下的Sun VM中运行JNI应用程序

我想找到一个压缩文件或虚拟机运行时模式,它将消除虚假内存错误,以便在这种情况下将小麦从谷壳中分离出来。有什么建议么?

+0

我发现跟踪Win32上的JNI内存问题不容易。 – 2009-01-21 04:37:15

+0

如果您最终创建排除文件,您是否介意在此张贴? – Arkadiy 2009-01-23 16:15:01

回答

1

如何在Java应用程序之外分析此本机代码?通常,JNI代码是一些不是Java特定的库的包装。不确定这是否适用于您的特定情况,但是如果是这样的话,那么可以通过在该库上编写简单的C或C++测试框架来隔离内存问题?

如果你的框架是用C++编写的,那么你也可以自己提供你自己的新的和删除操作符并跟踪内存使用情况。你必须收集统计数据并用一些脚本处理它们,但它可以很好地工作。

1

我无法回答您发布的问题,但可以详细说明您遇到的问题吗?

换句话说,你能告诉我们,如果它是...

  • 在JNI层,而不是一个JVM对象范围的问题?
  • 使用free'd内存?
  • 缓冲区覆盖/覆盖?
  • 其他内存损坏?

我最近不得不调试一个有问题的Java/C(在运行30多分钟后),事实证明它在释放内存后使用了内存。我尝试使用dmalloc,我的自定义内存泄漏库Valgrind,没有任何工作,因为我需要。

最后,我创建了一个简单的包装自由,malloc,calloc,realloc的包装,只需将内存地址和大小打印到文件。在中止之后(在GDB中),我可以及时回溯并确定内存何时被释放,以及哪些引用未被删除。

如果你的问题是在C/C++中,你可以在调试器中捕获错误,这可能适用于你。是的,这很乏味,但也许并不比筛选兆字节的Valgrind输出更糟糕。

希望能帮助&祝你好运。

0

虽然不像valgrind那样漂亮(根据我读过的),但你可以试试jmap和jhat。这些工具允许您拍摄运行过程的快照并查看发生了什么。我已经使用这种技术进行简单的内存泄漏,并且运行良好。但是,如果内存问题是由非jvm分配引起的,这将无济于事。