java 程序员是否需要为 jni 对象释放内存

Do java programmers need to deallocate memory for jni object

提问人:Juneyoung Oh 提问时间:9/21/2023 更新时间:9/21/2023 访问量:44

问:

有一个使用 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 很奇怪。

java-native-interface 免费

评论

0赞 Botje 9/21/2023
你的意思是不是?Stringjava.lang.String
1赞 user207421 9/21/2023
不可能在不看到相关的 JNI 代码的情况下进行 anwser。
0赞 Botje 9/21/2023
除非本机方法不遗余力地执行不明显的事情,否则所有结果都是字段包含对 JVM 对象的引用,就像在普通的 java 类中一样。

答:

1赞 vatbub 9/21/2023 #1

根据我的经验,本机对象的 Java 包装器对象像往常一样进行垃圾回收,但是本机代码必须执行自己的内存管理。让我们以 OpenCV 库为例,因为我对它很熟悉:

OpenCV 具有通常表示加载到内存中的图像的对象(但这与此示例无关)。对象将其图像数据保存在本机内存中,但它在 Java 内存中也有一个包装对象,以便 Java 代码可以与之交互。一旦 Java 包装器超出范围,它就会被垃圾回收,但要释放本机内存,程序员需要显式调用 .然而,这会将所有手动内存管理错误引入 Java 中:MatMatmat.release()

  • 忘记调用时内存泄漏mat.release()
  • 释放后使用,如果您调用 'mat.release() 然后尝试再次使用它做一些事情

因此,以我有限的经验,我想说本机代码需要提供释放本机内存的方法 (c.f. ),而 Java 代码需要显式调用该方法。Mat.release()