我已经使用JNI来调用分配内存的C方法。我有释放内存的方法,但是如果这些方法未被调用,那么当JVM停止时分配的内存会发生什么?如果从Java JNI分配的本机代码中泄漏内存,会发生什么情况?
如果卸载加载的库(请参阅How to unload library (DLL) from java JVM),“泄漏”的内存会发生什么情况?
我已经使用JNI来调用分配内存的C方法。我有释放内存的方法,但是如果这些方法未被调用,那么当JVM停止时分配的内存会发生什么?如果从Java JNI分配的本机代码中泄漏内存,会发生什么情况?
如果卸载加载的库(请参阅How to unload library (DLL) from java JVM),“泄漏”的内存会发生什么情况?
当JVM停止(中止或退出)时,操作系统将回收所有与该进程相关的内存。这包括在您的本机代码中分配的任何内存。
将会发生所有与普通C
代码一样的事情。这个内存将被泄露,除非smth会回收它。对于大多数现代操作系统来说,这意味着当进程退出时资源将被释放。卸载JVM意味着什么。
避免这个问题的常用方法是让C分配的内存与一些java对象强烈关联,并在该对象上有一个终结器,它调用JNI方法释放内存。这样,垃圾收集器和库的用户就会清理干净的内容,不需要记住调用清理JNI方法。