gpt4 book ai didi

java - JNI、垃圾收集和指针——Java/C++ 谁应该做什么?

转载 作者:可可西里 更新时间:2023-11-01 16:08:05 30 4
gpt4 key购买 nike

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

会不会

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

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

3.) 或者我们应该忘记 finalize(因为 finalizers 不可信),Java 负责调用 C++ 代码来删除对象

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

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

最佳答案

We have the concept of pointers in C++. Now if we allocate some memory in C++ and pass it on to Java as an object reference(using JNI) then who should be and who will be freeing it.

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

1.)The Garbage collector does it automatically in Java?

问题是您不知道它何时会运行。

2.)We need to explicitly do a delete on the pointer in the wrapped JNI class finalize method?

最好在 Java 中有一个 release() 方法,而不是暗示 C++ 必须删除它。您可能希望 C++ 回收内存。

3.)Or we should just forget finalize(as finalizers cannot be trusted) and it is responsibility of Java to call a C++ code which deletes the object

如果你的意思是,在 Java 中分配内存并将其传递给 C++ 来填充。这是我的偏好。

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

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

关于java - JNI、垃圾收集和指针——Java/C++ 谁应该做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8926706/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com