Java开发者是否需要为JNI对象手动释放内存?
JNI场景下对象的GC回收与内存释放问题
先给出涉及的Java类代码:
public class JniUser { private String name; private int age; public native int getAge(); public native String getName(); }
问题解答
GC能否识别JniUser对象是否可回收?
只要Java侧不存在对JniUser对象的有效引用,GC就会将其标记为可回收目标,和Native侧是否设置过它的字段无关。Java GC的回收判断基于Java堆内的引用链,只要Native代码没有通过JNI的**全局引用(Global Reference)**持有该对象,Java侧无引用时就会被正常回收。String类型是否需要手动释放内存?
分两种情况:- 如果Native侧是通过JNI标准函数(比如
NewStringUTF)创建Java String对象并赋值给name字段,这类String对象是在Java堆上分配的,完全受GC管理,不需要手动释放内存。 - 如果Native侧是在C/C++堆上自行分配字符串内存(比如用
malloc),然后通过指针让Java侧间接持有,这部分内存不在Java GC的管辖范围内,必须手动调用free释放,否则会造成内存泄漏。但通常在JNI场景下给Java String字段赋值,都会采用第一种标准方式,无需手动处理内存。
- 如果Native侧是通过JNI标准函数(比如
内容的提问来源于stack exchange,提问作者Juneyoung Oh
相关产品推荐
相关产品推荐

