我有一个用C编写的应用程序,它生成一个JVM并使用JNI与Java应用程序交互。我通过Process Explorer获得的内存占用量高达1GB,内存不足。据我所知,它应该能够达到2GB。我认为有一点是JVM使用的内存在Process Explorer中不可见。我的xmx设置为256,我添加了一些语句来观察java端内存,并且它达到峰值256并且GC正在完成它的工作并且它在这一方面都很好。所以我的问题是,其他700多MB的消费在哪里?那里有Java / JNI / C内存专家吗?
答案 0 :(得分:1)
JNI代码可能存在泄漏。
请记住对完成后使用的任何对象引用使用(* jni) - > DeleteLocalRef()。如果使用任何本机C缓冲区来创建新的Java对象,请确保在创建对象后将其释放。检查JNI规范以获取进一步的指导。
根据您使用的VM,您可能可以打开JNI检查。例如,在IBM JDK上,您可以指定“-Xcheck:jni”。
答案 1 :(得分:1)
在C中尝试一个不会产生JVM的测试应用程序,而是尝试分配越来越多的内存。查看测试应用是否可以达到2 GB的障碍。
答案 2 :(得分:0)
编写C测试工具并使用valgrind / alleyoop检查C代码中的泄漏,并类似地使用java jvisualvm工具。
答案 3 :(得分:0)
C和JNI代码也可以分配内存(malloc / free / new / etc),这在VM的256m之外。 xMX仅限制VM将自行分配的内容。根据您在C代码中分配的内容以及内存中加载的其他内容,您可能会或者可能无法达到2GB。
答案 4 :(得分:0)
如果你说这是Windows进程内存耗尽而不是JVM,那么我最初的猜测是你可能会从JVM中调用一些(你自己的)本机方法,而那些本机方法会泄漏内存。所以,我在这里赞同@John Gardner。
答案 5 :(得分:0)
非常感谢您的所有帮助,尤其是@alexander,我发现Java Heap正在使用通过Process Explorer看不到的所有额外内存。事实上,通过我运行JVM的内存消耗的其他测试包含在我从Process Explorer中看到的内容中。因此堆占用大量内存,我将不得不对此进行更多研究,并可能会提出另外一个问题。