java与免费c函数的绑定(bind): how to correctly free an object

标签 java garbage-collection java-native-interface jna finalize

好的,有一个针对指针调用的 C 方法可以释放内存区域。 我不希望我的 java 绑定(bind)用户显式调用此方法,因为在 java 中它没有任何意义,这基本上是一个数据结构。

所以,我刚刚进行了 Finalize() 重写,将 c 调用放在那里。 不管怎样,人们都说依赖 Finalize 不好……你有更好的主意吗?

最佳答案

使用finalize方法有一些问题:你无法保证何时或是否会调用它,它会迫使垃圾收集器做额外的工作,很容易出错.

释放资源是很常见的需求,无论它们是打开的文件描述符、窗口句柄、数据库结果集还是其他资源。在这些情况下,类具有显式的 closedispose 方法,用户必须调用这些方法。我建议您按照这些类设置的示例并添加一个 close 方法。如果您实现 AutoCloseable 接口(interface),API 用户甚至可以使用 try-with-resources 语句,而不必显式调用 close()

有时可能的替代方案是创建直接 ByteBuffer 并将其传递给 C 库,而不是由 C 库自行分配内存。当 ByteBuffer 对象被垃圾收集时,堆外缓冲区将被释放。顺便说一句,这是使用 java.lang.ref package 中的幻像引用来实现的。 .

关于java与免费c函数的绑定(bind): how to correctly free an object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22511194/

相关文章:

garbage-collection - 垃圾收集器能否到达用另一种语言编写的函数留下的 "garbage"?

c++垃圾收集和调用析构函数

android - 使用 Fluidsynth 在 Android 上播放来自 SoundFonts 的音符

java - Tomcat 中基于数据库的 ssl 客户端身份验证

java - 寻求有关使用 DAWG 实现文字游戏的建议

java - 调整 GC Overhead Exceeded 参数

java.lang.NoSuchFieldError 错误

javascript - 如果在执行 native java API 时抛出任何异常,如何在 JavaScript 中处理异常

java - uid 没有 android.permission.SEND_SMS

html - 删除 HTML 使用 Java 删除对齐方式