提问人:Juneyoung Oh 提问时间:9/21/2023 更新时间:9/21/2023 访问量:44
java 程序员是否需要为 jni 对象释放内存
Do java programmers need to deallocate memory for jni object
问:
有一个使用 JNI 的类。一些代码如下
public class JniUser {
private String name;
private int age;
public native int getAge();
public native String getName();
}
在本机代码中,设置名称和年龄字段。据我所知,垃圾回收器不会收集任何引用的 java 对象。但即使在这种情况下,GC能否检测到这个对象是GC的目标?
我对此有疑问,因为字符串是引用类型,但不是由 VM 分配的。
我应该手动释放内存吗?
P.S. 我知道使用 JNI 实现 VO 很奇怪。
答:
1赞
vatbub
9/21/2023
#1
根据我的经验,本机对象的 Java 包装器对象像往常一样进行垃圾回收,但是本机代码必须执行自己的内存管理。让我们以 OpenCV 库为例,因为我对它很熟悉:
OpenCV 具有通常表示加载到内存中的图像的对象(但这与此示例无关)。对象将其图像数据保存在本机内存中,但它在 Java 内存中也有一个包装对象,以便 Java 代码可以与之交互。一旦 Java 包装器超出范围,它就会被垃圾回收,但要释放本机内存,程序员需要显式调用 .然而,这会将所有手动内存管理错误引入 Java 中:Mat
Mat
mat.release()
- 忘记调用时内存泄漏
mat.release()
- 释放后使用,如果您调用 'mat.release() 然后尝试再次使用它做一些事情
因此,以我有限的经验,我想说本机代码需要提供释放本机内存的方法 (c.f. ),而 Java 代码需要显式调用该方法。Mat.release()
上一个:是否可以在没有 for 循环的情况下释放 2D 数组?
下一个:删除链表中的节点
评论
String
java.lang.String