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

时间:2012-01-19 13:21:26

标签: java c++ garbage-collection java-native-interface

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

会不会

1.)垃圾收集器是否在Java中自动执行?

2.)我们需要在包装的JNI类finalize方法中对指针进行显式删除吗?

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

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

执行此操作的最佳做​​法是什么,反之亦然(当我们将对象从Java传递到C ++时)?

1 个答案:

答案 0 :(得分: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();来确定性地清理它。

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