当有人从C库绑定到Java(或任何其他垃圾收集语言而没有保证运行的析构函数)时,它们如何处理非垃圾收集内存的正确释放?
编辑:我正在考虑的事情(我知道这在我的原始问题中没有明确说明)是当一块非gc'ed内存保存对其他非gc'ed资源的引用时需要释放的对象被释放.例如,如果你有一个非gc'ed链表节点,这是一个很长的这类节点列表的头部,你想让gc系统最终自动清理它,你如何设置它?
我是Java新手,在高中时期有一些C++背景.现在我正在努力创造一些东西,我选择Java作为编程语言.
我完成了我的作业,看了很多关于Java的"析构函数",finalize()方法和close()或shutdown()方法.但我仍然认为我不知道这应该如何工作(当然下面有更多信息)
好的,具体的问题是为什么我需要调用close()或shutdown()方法?
在我的特定情况下,我正在使用一个我没有开发处理智能卡读卡器的类,但我已经看到文件管理的情况,你必须调用close()方法,将类似.
不是调用close()方法与在C++中释放内存的想法相同(那很糟糕)?意思是,我必须处理对象的删除或破坏......不是GC的用途吗?
我试图用于智能卡读卡器的类不是最好的选项可能是一个选项,这个类实现finalize()方法可能更好,所以当不再使用并准备好GC时,释放内存(很可能是本机代码)和/或释放GC可能不知道如何操作的硬件资源.
但是文件管理类呢?那些是非常常用和维护的,为什么仍然需要close()方法?我理解存在的目的,解锁文件,但为什么我要记得关闭它?一旦不再使用该对象,则至少在最常见的情况下自动解锁文件.
最后,使用实现finalize()方法的类来包装需要关闭或关闭的类是否是一个正确的解决方法,我调用close()或shutdown()方法?
我已经看到finalize()方法不是很受欢迎,所以这就是我问这个问题应该如何解决的原因.
提前致谢
胡安
PS:我见过的:
有没有办法在 java 对象被销毁之前知道?
例如:
A 类{}
我已将其实例化为 new A()。现在我想知道这个对象什么时候会被销毁并在它被销毁之前执行一些操作。
我有以下代码,在我的班级中逐行读取文件时效果很好.
try { FileInputStream in = new FileInputStream(filename);
BufferedReader reader=new BufferedReader(new InputStreamReader(in));
String line;
while((line=reader.readLine())!=null){
// read the file
}
}
catch (Exception e) {
System.out.println(e);
}
Run Code Online (Sandbox Code Playgroud)
但是如果我尝试将命令添加为close,那么在文件读完之后,我就得到了错误:
in.close();
Error:(131, 9) java: cannot find symbol
symbol: variable in
location: class ReadFile
Run Code Online (Sandbox Code Playgroud)
我在使用后搜索了清洁对象,并在程序结束前需要关闭文件.并在Java上发现了几个帖子,但很多都非常矛盾.关键是,最后我感到非常困惑.
我错了,或者Java编程有点模糊和混乱?我的意思是,显然没有真正使用析构函数,使用finalize是非常值得怀疑的,并且使用close也被认为是不必要的.关于这些问题的一些帖子是矛盾和非决定性的.
那么,如何在这里继续?在我真的需要关闭文件的情况下,如何摆脱这个错误信息?关闭文件真的可有可无和不必要吗?如何为程序完成清理类实例?