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

问题描述 投票:0回答:1

有一个使用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 java-native-interface free
1个回答
0
投票

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

OpenCV 有

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

  • 如果忘记调用就会内存泄漏
    mat.release()
  • 如果您调用 `mat.release() 然后尝试再次用它做某事,则使用释放后

因此,以我有限的经验,我认为本机代码需要提供一种释放本机内存的方法(参见

Mat.release()
),而 Java 代码需要显式调用该方法。

© www.soinside.com 2019 - 2024. All rights reserved.