我读过的关于java finalize方法的所有内容都说不要使用它.它似乎几乎永远不会被保证被调用,即使它存在也可能出现问题.
还有一些其他问题要求何时使用它,似乎普遍的共识绝不是.
我自己从未使用它(主要是因为没有警告),我没有看到它在任何地方使用过.
是否有任何合适的案例?有没有其他选择的情况?
如果没有,为什么会在那里?是否有内部类使用它并要求方法可用?或者它只是不应该存在的东西?
我对使用它的时间并不是那么感兴趣(已经用"从不"回答),但澄清为什么它甚至给出了"从不"的回答.如果它是如此无用和危险,为什么它没有被折旧和删除?
我只是在commons-io库中挖掘并发现了这个:
Keeps track of files awaiting deletion, and deletes them when an associated marker object is reclaimed by the garbage collector.
这可以在FileCleaningTracker对象的文档中找到.
现在我很好奇我怎么能自己做到这一点?我的代码如何检测垃圾收集器何时回收对象?
在浏览JAX_WS端点的要求时,我遇到了这个,
JAX-WS endpoint implementation class must not implement `finalize()` method.
Run Code Online (Sandbox Code Playgroud)
但我没有找到更好的答案解释这一点.为什么我们不应该实现finalize()方法,如果我们实现了会发生什么?
有人可以点亮这个吗?
我是Java新手,在高中时期有一些C++背景.现在我正在努力创造一些东西,我选择Java作为编程语言.
我完成了我的作业,看了很多关于Java的"析构函数",finalize()方法和close()或shutdown()方法.但我仍然认为我不知道这应该如何工作(当然下面有更多信息)
好的,具体的问题是为什么我需要调用close()或shutdown()方法?
在我的特定情况下,我正在使用一个我没有开发处理智能卡读卡器的类,但我已经看到文件管理的情况,你必须调用close()方法,将类似.
不是调用close()方法与在C++中释放内存的想法相同(那很糟糕)?意思是,我必须处理对象的删除或破坏......不是GC的用途吗?
我试图用于智能卡读卡器的类不是最好的选项可能是一个选项,这个类实现finalize()方法可能更好,所以当不再使用并准备好GC时,释放内存(很可能是本机代码)和/或释放GC可能不知道如何操作的硬件资源.
但是文件管理类呢?那些是非常常用和维护的,为什么仍然需要close()方法?我理解存在的目的,解锁文件,但为什么我要记得关闭它?一旦不再使用该对象,则至少在最常见的情况下自动解锁文件.
最后,使用实现finalize()方法的类来包装需要关闭或关闭的类是否是一个正确的解决方法,我调用close()或shutdown()方法?
我已经看到finalize()方法不是很受欢迎,所以这就是我问这个问题应该如何解决的原因.
提前致谢
胡安
PS:我见过的:
我有以下代码,在我的班级中逐行读取文件时效果很好.
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也被认为是不必要的.关于这些问题的一些帖子是矛盾和非决定性的.
那么,如何在这里继续?在我真的需要关闭文件的情况下,如何摆脱这个错误信息?关闭文件真的可有可无和不必要吗?如何为程序完成清理类实例?
(此问题不同于您为什么要实现finalize()?此问题与从Java平台弃用有关,另一个问题与在应用程序中是否应使用此机制有关。)
为什么finalize()在Java 9中不推荐使用该方法?
是的,它可能以错误的方式使用(例如,从垃圾收集中保存对象(尽管仅一次)或尝试关闭其中的某些本机资源(比完全不关闭更好))以及许多其他方法可能会被错误地使用。
那么,finalize()真的有这么危险的或绝对无用,它是必要踢出来的Java?
我正在使用 Mysql GET_LOCK在分布式系统中实现锁定服务。在调用我的 getLock() 方法时,如果客户端获得了锁,我会在数据库中创建一个条目并在释放锁时删除该条目。
假设调用客户端将在达到其目的后释放锁。但是,我想确保在客户端不释放它或不进行适当清理的情况下释放锁。
一种方法是在我的锁定对象上使用 finalize 方法以在调用 finalize 时释放它。然而,它并不理想,增加了复杂性并且在 Java 9 中被弃用。我读到了比终结器更好的 Phantom 引用,但它的复杂程度也很高。我把它作为我的最后手段。
有没有更简单、更少依赖 JVM 的方法来处理这个用例?
java garbage-collection phantom-reference finalize finalizer
我重写了finalize()方法,在重新声明对象的内存空间时做了一些工作.但是有人说我必须finalize()在覆盖方法时调用父finalize()进程.但是构造函数自动调用超类构造函数而不像finalize()方法.
你能告诉我一件事......?
我正在用Java编写网络程序.我使用ServerSocket和Socket对象使用TCP发送和接收消息.我的程序如果运行一小段时间运行正常但是如果我运行它的时间较长,我会收到以下错误:
java.net.SocketException: No buffer space available (maximum connections reached?): connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
我认为这可能是因为我没有关闭所有套接字但是我已经改变了我的代码:当我想要一个新的套接字并添加了一个finalize方法来关闭它时,我创建了一个类.我还有一个关闭ServerSocket的finalize方法,所以我不知道问题是什么.
在我收到错误之后,如果我立即再次运行程序,它会比以前更快地遇到问题.然后,如果我等待一段时间并运行它,它会回到原来的时间.
我真的无法解决这个问题,而且我一直试图弄清楚这个问题.有谁知道问题是什么?
提前致谢!
更新:
所以我已经弄清楚了错误的来源,这真的很奇怪.我有以下代码导致问题:
try {
sock = new Socket(InetAddress.getByName(ipaddr), port);
sock.close();
// os = sock.getOutputStream();
// byte[] arr = s.getBytes();
// os.write(arr);
// os.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
sock.close();
} catch (Exception e) …Run Code Online (Sandbox Code Playgroud) java ×8
finalize ×5
finalizer ×2
buffer ×1
class ×1
code-cleanup ×1
file-io ×1
java-9 ×1
jax-ws ×1
jdk1.6 ×1
serversocket ×1
shutdown ×1
sockets ×1
tcp ×1
web-services ×1