S K*_* Kr 12 java multithreading finalizer shutdown-hook
我只是不明白为什么必须使用Runtime.addShutdownHook.如果你想在jvm退出时进行一些清理,为什么不重载守护进程类的finalize方法.使用shutdown hook而不是finalize方法有什么好处.
还有一个不推荐使用的函数runFinalizersOnExit.如果我将其设置为false,我相信终结器将无法运行.这与java保证终结器总是在垃圾收集之前运行相矛盾.
dka*_*zel 21
没有一个终结将保证永远运行.finalize()
在对象被垃圾收集时调用.但是,当程序运行时,垃圾收集器可能无法收集任何内容.
当jvm正常退出时,运行对比关闭钩子.所以,即使这不是100%保证,但它非常接近.只有少数边缘情况不会运行关闭挂钩.
编辑 我查找了没有执行关闭挂钩的边缘情况
关闭挂钩IS执行:
关闭挂钩IS NOT执行:
关于您的询问
如果你想在jvm退出时做一些清理工作,为什么不直接重载守护进程类的finalize方法
我从这篇文章中找到了很好的信息
finalize()
在垃圾收集器回收对象之前调用。JVM 不保证何时调用该方法。
finalize()
如果对象通过 Finalize 方法恢复自身,则 GC 线程仅调用一次,而不会再次调用 Finalize。
在您的应用程序中,您可能有一些活动对象,这些对象永远不会调用垃圾收集。
Finalize 方法抛出的任何异常都会被 GC 线程忽略
System.runFinalization(true)
和Runtime.getRuntime().runFinalization(true)
methods 增加了调用method 的概率finalize()
,但现在这两种方法已被弃用。由于缺乏线程安全性并可能产生死锁,这些方法非常危险。
回到 shutdownHooks,根据 oracle文档
public void addShutdownHook(Thread hook) 注册一个新的虚拟机关闭钩子。
Java 虚拟机关闭以响应两种事件:
但即使是 oracle 文档也引用了这一点
关闭挂钩也应该快速完成其工作。当程序调用 exit 时,期望虚拟机将立即关闭并退出。
在极少数情况下,虚拟机可能会中止,即停止运行而不完全关闭
考虑到这两种方法的缺点,您应该遵循以下方法
不要依赖finalize()
或shutdown hooks
释放应用程序中的关键资源。
适当地使用try{} catch{} finally{}
块并释放块中的关键资源 finally(}
。finally{}
在block、catchException
和中释放资源期间Throwable
。
归档时间: |
|
查看次数: |
3726 次 |
最近记录: |