问题描述
我有一个C ++代码库,其中使用JNI创建JVM,并偶尔与用Java实现的库进行交互。我很好奇,在这种用例中,Java的垃圾收集器是否仍然可以可靠地运行和清理?
我在网上找到的有关JNI的大多数信息似乎都与“相反的”用例有关,在这种情况下,人们通常似乎主要拥有Java代码,有时会通过JNI与本机代码交互。对于这种用例,我发现例如以下online:
在大多数情况下,自动取消对本地引用的垃圾回收已不再在范围内,可以防止内存泄漏。当本机线程返回Java(本机方法)或与JVM分离(调用API)时,就会发生这种自动垃圾回收。如果未发生自动垃圾回收,则可能会导致本地参考内存泄漏。如果本机方法没有返回到JVM,或者使用Invocation API的程序没有与JVM分离,则可能发生内存泄漏。
在这种情况下,我不确定“返回Java”到底意味着什么。只是偶尔从C ++调用基于Java的方法就足够了,这是否已算作“返回Java”?如果没有,有什么方法可以确保垃圾收集器有机会在我的用例中运行?
解决方法
使用JNI创建的JVM是完整JVM ,包括GC。
这样想:您通常用来运行Java程序的java
命令只是一个小的JNI程序,它创建JVM,找到命令行上命名的类,并创建一个静态调用main(String[])
方法。