JNI API DestroyJavaVM 后 JVM 使用的空闲内存

Free memory used by JVM after JNI API DestroyJavaVM

我有一个 C 程序使用 dlopen() 动态加载 libjvm,使用 dlsym() 查找 JNI_CreateJavaVM 函数地址并使用它初始化 JVM。

在做了一些 Java 事情之后(已经可以正常工作),我想释放 JVM 资源并使进程重用由 JVM 在堆上分配的内存。 .

我正在尝试 (*jvm)->DestroyJavaVM(),然后分配更多内存,但它似乎没有重用 JVM 分配的内容。

是否需要调用其他一些 API 来强制 JVM 释放分配的内存?

我的意思是,在常规用法中,您不关心在程序结束时释放资源,因为 OS 会释放进程使用的内存。但是这里我想强制清理,为另一个消耗大量内存的库重用资源。

顺便说一句,这有意义吗?还是我错过了什么?

谢谢! 塞布

HotSpot JVM 不会尝试在退出时释放所有资源。特别是,它不会释放对象堆、代码缓存、元空间等。在进程终止之前无法回收此内存。

Threads::destroy_vm. Note that it does not say anything about releasing memory. Also, JVM does not attempt 的注释中描述了 VM 关闭顺序以终止或挂起守护进程线程。

documentationDestroyJavaVM 表示

Unloading of the VM is not supported.

典型的解决方案是在单独的进程中启动 JVM。