Я использовал JNI для вызова методов C, которые выделяют память. У меня есть методы для освобождения памяти, но если эти методы не вызываются, что происходит с выделенной памятью при остановке JVM?
Что происходит с "утечкой" памяти, если вы выгружаете загруженную библиотеку (см. Раздел "Как выгрузить библиотеку (DLL) из java JVM)?
Когда JVM остановлен (убит или завершен), ОС вернет всю связанную память с этим процессом. Это включает в себя любую память, выделенную внутри вашего собственного кода.
Случится все то же самое, что происходит с обычным C
кодом. Эта память будет просочиться, если smth не вернет ее. Для большинства современных ОС это означает, что ресурсы будут освобождены при выходе из процесса. Выгрузка JVM ничего не значит.
Обычный способ избежать этой проблемы состоит в том, чтобы связанная с C память была сильно связана с каким-либо java-объектом и имела финализатор этого объекта java, который вызывает метод JNI для освобождения памяти. Таким образом, все будет очищено сборщиком мусора, и пользователь вашей библиотеки не должен забывать о методе очистки JNI.