有一个使用JNI的类。一些代码如下
public class JniUser {
private String name;
private int age;
public native int getAge();
public native String getName();
}
在本机代码中,设置姓名和年龄字段。据我所知,垃圾收集器不会收集任何引用的java对象。但即使在这种情况下,GC 也能检测到这个对象是否是 GC 的目标?
我对此有疑问,因为 String 是引用类型但不是由 VM 分配的。
我应该手动释放内存吗?
附注我知道使用 JNI 来实现 VO 很奇怪。
根据我的经验,本机对象的 Java 包装对象照常被垃圾收集,但是本机代码必须执行自己的内存管理。我们以 OpenCV 库为例,因为我很熟悉它:
OpenCV 有
Mat
对象,通常表示加载到内存中的图像(但这与本示例无关)。 A Mat
对象将其图像数据保存在本机内存中,但它在 Java 内存中还有一个包装对象,以便 Java 代码可以与其交互。 Java 包装器一旦超出范围就会被垃圾收集,但为了释放本机内存,程序员需要显式调用 mat.release()
。然而,这将所有手动内存管理错误引入到 Java 中:
mat.release()
因此,以我有限的经验,我认为本机代码需要提供一种释放本机内存的方法(参见
Mat.release()
),而 Java 代码需要显式调用该方法。