我用java编写的项目使用JNI使用C ++库。 所有代码都是由我们编写的,所以我拥有所有源代码。
几个小时后,机器内存不足,尽管我的进程只是迭代文件并删除了有关上一个文件的所有内存。
我确信存在内存泄漏,通常我使用Valgrind,但似乎他无法很好地应对Java并且认为JVM正在泄漏,即使对于“hello world”java项目也是如此。
我用单元测试测试了C ++部分(主要流程),并在单元测试中使用了valgrind,但是没有发现任何泄漏。它没有任何证据,因为我可能错过了很多潜在的流程。
我的主要问题是,我怎样才能找到我的泄漏?
知道谁在消耗内存,java或本机部分会非常有帮助吗?他们在同一个过程中。
感谢。
答案 0 :(得分:1)
根据我的经验,Valgrind实际上可用于JVM,它仍然是捕获C / C ++代码泄漏的最佳工具,即使使用JNI也是如此。所以你的问题包含了你需要的答案;)
如果您未能同时使用JNI和Valgrind,请参阅Valgrind and Java。
答案 1 :(得分:1)
您可以jemalloc使用debug native memory leaks。 This blog post有一个使用jemalloc调试java应用程序中的本机内存泄漏的详细示例。