JNI,垃圾收集和Pointers-Java/C++谁应该做什么?

sea*_*rse 10 c++ java java-native-interface garbage-collection

我们在C++中有指针的概念.现在,如果我们在C++中分配一些内存并将其作为对象引用传递给Java(使用JNI)那么应该是谁以及谁将释放它.

那将会

1.)垃圾收集器是用Java自动完成的吗?

2.)我们需要在包装的JNI类finalize方法中明确地对指针执行删除操作吗?

3.)或者我们应该忘记finalize(因为终结器不能被信任)并且Java负责调用删除对象的C++代码

4.)或者是否有某种方法可以直接在Java本身中释放内存(不确定Java是如何编写C++指针以便删除它的?)

这样做的最佳实践是什么,反之亦然(当我们将对象从Java传递给C++时)?

Pet*_*rey 8

我们在C++中有指针的概念.现在,如果我们在C++中分配一些内存并将其作为对象引用传递给Java(使用JNI)那么应该是谁以及谁将释放它.

最好的策略通常是让分配器也是释放数据的分配器.

1.)垃圾收集器是用Java自动完成的吗?

这个问题是你不知道什么时候会运行.

2.)我们需要在包装的JNI类finalize方法中明确地对指针执行删除操作吗?

最好在Java中使用release()方法而不是暗示C++必须删除它.您可能希望C++回收内存.

3.)或者我们应该忘记finalize(因为终结器不能被信任)并且Java负责调用删除对象的C++代码

如果你的意思是,用Java分配内存并将其传递给C++进行填充.这是我的偏好.

我会使用可以使用ByteBuffer.allocateDirect(),你可以打电话((DirectBuffer) buffer).cleaner().clean();来确定性地清理它.

这可以使回收内存更简单,可能在应用程序的生命周期中可以使用相同的缓冲区.