垃圾收集器是否可以在从C ++创建的JVM中运行?

问题描述

我有一个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[])方法。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...