1
238
您可以将其用作持有外部资源(套接字、文件等)的对象的后盾。实施
使生效
它在特殊情况下提供了额外的安全性。并不是每个打电话的人都会做正确的事情
我同意很少需要它。正如评论者指出的,它伴随着GC开销。只有在长时间运行的应用程序中需要“安全带和吊带”时才使用。
我认为从Java9开始,
|
2
180
在终结器中执行任何重要的操作(基本上除了日志记录之外的任何操作)在以下三种情况下也很好:
幻象引用 要求 收集前应采取的具体行动?这让我们回到了malloc/free的时代。) 其他时候,你需要你认为你正在管理的资源来变得更加健壮。例如,为什么需要关闭该连接?它最终必须基于系统提供的某种类型的I/O(套接字、文件等),因此,当最低级别的资源是gced时,为什么不能依靠系统来关闭它呢?如果另一端的服务器绝对要求您干净地关闭连接,而不是仅仅断开插座,那么当有人在运行代码的机器的电源线上绊倒,或者中间的网络断开时,会发生什么情况? 免责声明:我过去曾参与过JVM实现。我讨厌终结器。 |
3
57
一条简单的规则:永远不要使用终结器。 仅仅一个对象有一个终结器(不管它执行什么代码)的事实就足以导致垃圾收集的大量开销。 从 article 布莱恩·戈茨:
|
4
49
我在生产代码中使用finalize的唯一一次是执行一个检查,检查给定对象的资源是否已清理,如果没有,则记录一条非常响亮的消息。它实际上并没有尝试自己去做,如果做得不好,它会大喊大叫。结果证明非常有用。 |
5
38
|
6
29
公认的答案是好的,我只是想补充一点,现在有一种方法可以实现finalize的功能,而无需实际使用它。 看看“参考”类。弱参考、幻影参考和;软参考。 放心 被称为。 关于最后确定:
如果您在finalize中发现这样的代码,那么可以保证编写它的人会感到困惑。 如果它在其他地方,则可能是代码是坏模型的有效补丁(一个类停留很长时间,并且由于某些原因,它引用的东西必须在对象被GC调用之前手动释放)。一般来说,这是因为有人忘记删除一个侦听器或其他东西,并且不明白为什么他们的对象没有被GC删除,所以他们只是删除它所指的东西,耸耸肩然后走开。 它永远不应该被用来“更快地”清理东西。 |
7
28
我不知道你能从中得到什么,但是。。。
所以我想太阳找到了 一些 |
8
20
结果:
===================================== 所以您可以在finalize方法中使不可访问的实例可访问。 |
9
11
我从1.0 alpha 3(1995)开始就一直在用Java编程,我还没有覆盖finalize的任何内容。。。 |
10
6
|
11
5
要强调以上答案中的一点:终结器将在单独的GC线程上执行。我听说过一个主要的Sun演示,开发人员在一些终结器上添加了一个小睡眠,并故意将一个其他方面都很花哨的3D演示带到它的膝盖上。
Eckel在Java中的思想 a good section 在这个问题上。 |
12
5
在工作中要小心
直到很久以后,我们才发现出现了问题,但最终罪魁祸首总是使用JNI调用的finalize()方法。 |
13
4
嗯,我曾经用它来清理没有返回到现有池中的对象。 他们被传递了很多次,所以不可能知道他们什么时候可以安全地回到游泳池。问题是它在垃圾收集过程中引入了一个巨大的惩罚,这个惩罚远远大于合并对象所节省的成本。在我拆掉整个水池,使一切充满活力并完成之前,它已经生产了大约一个月。 |
14
3
许多数据库驱动程序在其语句和连接实现中这样做是为了对忘记调用close的开发人员提供一点安全性。 |
15
2
编辑:好吧,它真的不起作用。我实现了它,并认为如果它有时失败,对我来说没关系,但它甚至一次都没有调用finalize方法。 我不是一名专业程序员,但在我的程序中,我有一个案例,我认为这是使用finalize()的一个很好的案例,这是一个缓存,它在销毁内容之前将内容写入磁盘。因为没有必要每次销毁时都执行它,它只会加速我的程序,我希望我没有做错。
|
16
2
删除已添加到全局/静态位置(不需要)且在删除对象时需要删除的内容非常方便。例如: private void addGlobalClickListener() { weakAwtEventListener = new WeakAWTEventListener(this); Toolkit.getDefaultToolkit().addAWTEventListener(weakAwtEventListener, AWTEvent.MOUSE_EVENT_MASK); } @Override protected void finalize() throws Throwable { super.finalize(); if(weakAwtEventListener != null) { Toolkit.getDefaultToolkit().removeAWTEventListener(weakAwtEventListener); } } |
17
0
iirc—您可以使用finalize方法作为实现昂贵资源池机制的一种手段—这样他们就不会得到GC。 |
18
0
|
19
0
一旦我们使用完资源(文件、套接字、流等),就需要关闭它们。他们通常有
在Java7中,我们有 try-with-resources
在上面的示例中,try with resource将自动关闭资源
|
20
0
就我个人而言,我几乎从未使用过
(
那么,用一个姐姐
|
21
0
接受的答案列出了可以在finalize期间关闭资源的列表。 然而 this answer 显示了至少在使用JIT编译器的java8中,您会遇到意外的问题,有时甚至在您从对象维护的流中读取完之前就调用终结器。 不 被推荐。 |
Sam · jvm如何优化循环代码? 6 年前 |
pushpavanthar · 纱线中的调谐火花作业 6 年前 |
Ashish K · 在Groovy中将字符串参数传递给对象方法参数 6 年前 |
St.Antario · 在Java中侦听多个目录以创建文件 6 年前 |
Bonsaisteak · 为什么年轻一代需要三个区域来收集垃圾? 6 年前 |