我已經使用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方法。