java9之前finalizer,java9使用cleaner代替了finalizer。相比finalizer,cleaner不会污染API而且cleaner有类库可以控制它的线程。避免使用的原因:行为的不稳定性它两都不能保证及时的执行,从方法可达到开始到最终的执行,时间是任意长的。所以千万不要使用他们来更新重要的持久状态,如释放流资源、分布式锁等。System.gc和System.runFinalization这两个方法会增加finalizer和cleaner被执行的机会,但是不保证一定会执行。唯一能保证它两会被执行的两个方法有致命的缺陷,已经被废除很久了。移植性问题不同的JVM堆垃圾回收的算法不同,如果程序依赖finalizer或者cleaner被执行的时间点,那么程序的表现可能截然不同性能问题finalizer和cleaner有一个非常严重的性能损耗。

Java 为什么要避免使用finalizer和Cleaner

Java 为什么要避免使用finalizer和Cleaner

Java 为什么要避免使用finalizer和Cleaner