垃圾收集java绑定与免费c函数:如何正确释放对象
好的,有一个在指针上调用的C方法可以释放内存区域。 我不希望我的java绑定用户明确地调用这个方法,因为在java中它没有意义,而且这基本上是一个数据结构
所以,我刚刚做了一个finalize()覆盖,将c调用放在那里。 不管怎么说,人们都说,依靠……是不好的。。。你有更好的主意吗
你可以在下面搜索框中键入要查询的问题!
好的,有一个在指针上调用的C方法可以释放内存区域。 我不希望我的java绑定用户明确地调用这个方法,因为在java中它没有意义,而且这基本上是一个数据结构
所以,我刚刚做了一个finalize()覆盖,将c调用放在那里。 不管怎么说,人们都说,依靠……是不好的。。。你有更好的主意吗
# 1 楼答案
使用
finalize
方法有几个问题:您无法保证何时或是否调用它,这会迫使垃圾收集器做额外的工作,很容易出错释放资源是非常常见的需求,无论它们是打开的文件描述符、窗口句柄、数据库结果集还是其他什么。在这些情况下,类具有显式的
close
和dispose
方法,用户必须调用这些方法。我建议您按照这些类设置的示例添加close
方法。如果实现AutoCloseable
接口,API用户甚至可以使用try with resources语句,而不必显式调用close()
有时可能的替代方法是创建一个直接ByteBuffer并将其传递给C库,而不是C库自己分配内存。然后,当ByteBuffer对象被垃圾收集时,会释放堆外缓冲区。顺便提一下,这是使用来自^{} package 的幻影引用实现的