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++时)?
我们在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();来确定性地清理它.
这可以使回收内存更简单,可能在应用程序的生命周期中可以使用相同的缓冲区.
| 归档时间: |
|
| 查看次数: |
4043 次 |
| 最近记录: |