Cleaner机制

JDK9之后用cleaner机制代替了finalize机制,提供了内存清理的另一方法。我们都知道finalize机制饱受诟病,因为它回收对象前要先执行Object.finalize()中的逻辑,降低了内存回收的效率,而且它不能保证被及时执行,这点很致命,导致对象不能及时被回收,例如如果利用finalize关闭打开的文件时,因为系统的文件描述符是有限的,如果不能及时的关闭文件,会导致无法打开更多的文件。

那么cleaner机制怎么样呢?先来看下cleaner机制的使用方法。

 首先它的使用方法有点繁琐,和try-with-resource机制一样,需要实现AutoCloseable接口,这样在重写的close()方法中释放资源会被自动调用回收。cleaner机制需要创建单独的线程去执行逻辑,这与finalize机制不同。执行finalize机制的线程不可控所以cleaner机制不存在类似于先执行finalize逻辑在回收对象的问题,即只要执行了cleaner机制就不会降低垃圾回收效率。但是前提是执行了cleaner机制,因为它的clean()方法还是写在重写的close()方法中等待被自动调用,所以无法保证保证被及时执行。

虽然都不能保证垃圾被及时回收,但是finalize机制和cleaner机制还是有用途的。可以用来回收本地对等类。本地对等类是java对象委托在本地的非java对象,垃圾收集器不知道它们,所以需要这两个机制去回收。还可以用来回收非堆内存,因为GC只回收堆中对象,栈中也会产生内存占用,需要用finalize机制去回收。另外,finalize机制和cleaner机制可以作为垃圾回收的最后一道屏障,这个时候回收效率慢没关系,因为不会依赖他们去回收垃圾,只是用来把好最后一关。

所以,垃圾收集不能依赖finalize机制和cleaner机制去自动回收,最好的方式是用完即使用try-with-resource机制显示释放或者放入资源池重用。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值