在valgrind下运行时,太阳JVM会发出很多额外的噪音,这使得在应用程序中跟踪内存问题非常具有挑战性。
我想找到一个抑制文件或VM运行时模式,它会消除虚假内存错误,以便在这种情况下将小麦与谷壳分开。有什么建议吗?
答案 0 :(得分:1)
如何在Java应用程序之外分析此本机代码?通常,JNI代码是某些非Java特定库的包装器。不确定这是否适用于您的特定情况,但如果是,那么可能通过在该库周围编写一个简单的C或C ++测试框架来隔离内存问题?
如果你的框架是用C ++编写的,那么你也可以自己提供自己的new和delete操作符并跟踪内存使用情况。您必须收集统计信息并使用一些脚本处理它们,但它可以很好地工作。
答案 1 :(得分:1)
我无法解答您发布的问题,但您能详细说明您遇到的问题吗?
换句话说,你能告诉我们它是不是......
我最近不得不调试一个有问题的Java / C(在运行30分钟后),结果是在它被释放后使用内存。我尝试使用dmalloc,我的自定义内存泄漏库,Valgrind,没有一个按我的需要工作。
最终我在free,malloc,calloc,realloc周围创建了一组简单的包装器,它只是将内存地址和大小打印到文件中。在它中止之后(在GDB内)我可以及时回溯并找出内存何时被释放以及引用未被删除的位置。
如果您的问题是在C / C ++中,并且您可以在调试器中捕获错误,这可能对您有用。是的,这很乏味,但也许并不比筛选出数百万的Valgrind输出更糟糕。
希望有帮助&祝你好运。
答案 2 :(得分:0)
虽然不像valgrind那样漂亮(基于我所读到的),你可以试试jmap和jhat。这些工具允许您拍摄正在运行的进程的快照,并查看正在进行的操作。我已经将这种技术用于简单的内存泄漏,并且运行良好。但是,如果内存问题是由非jvm分配引起的,这将无济于事。