4

sun JVM 在 valgrind 下运行时会发出很多额外的噪音,这使得跟踪应用程序中的内存问题非常具有挑战性。

我想找到一个抑制文件或 VM 运行时模式,它可以去除虚假的内存错误,以便在这种情况下将小麦与谷壳分开。有什么建议么?

4

3 回答 3

1

在 Java 应用程序之外分析这个本机代码怎么样?通常,JNI 代码是一些非 Java 特定库的包装器。不确定这是否适用于您的具体情况,但如果是这样,那么也许可以通过围绕该库编写一个普通的 C 或 C++ 测试框架来隔离内存问题?

如果您的框架使用 C++,那么您也可以提供自己的 new 和 delete 运算符并自己跟踪内存使用情况。您必须收集统计数据并使用一些脚本对其进行处理,但它可以很好地工作。

于 2009-01-25T17:28:09.663 回答
1

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

换句话说,你能告诉我们是不是……

  • 在 JNI 层而不是 JVM 对象范围问题?
  • 使用空闲内存?
  • 缓冲区覆盖/覆盖?
  • 其他内存损坏?

我最近不得不调试一个有问题的 Java/C(在运行 30 多分钟后),结果证明它在释放后正在使用内存。我尝试使用 dmalloc,我的自定义内存泄漏库,Valgrind,但没有一个可以满足我的需要。

最终,我围绕 free、malloc、calloc、realloc 创建了一组简单的包装器,它们简单地将内存地址和大小打印到文件中。在它中止后(在 GDB 中),我可以及时回溯并找出内存何时被释放以及没有被删除的引用在哪里。

如果您的问题出在 C/C++ 中,并且您可以在调试器中捕获错误,这可能对您有用。是的,这很乏味,但可能不会比筛选数兆字节的 Valgrind 输出更糟糕。

希望有帮助,祝你好运。

于 2009-01-28T23:23:52.063 回答
0

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

于 2009-01-29T04:03:19.020 回答