JVM 对于覆写了 Object.finalize()
方法的类是实例,在垃圾回收时,先放进一个队列里,
然后用一个线程执行这些实例的 finalize 方法,最后才做内存回收。
这个机制的问题是:它会影响垃圾回收,如果实现了 finalize 的实例很多,那么回收队列就会很长,而只有一个线程
在执行这些方法,这些对象就会回收得很慢。
最近碰到的一个问题跟 finalize 方法有关。
厂商提供的代码把 javax.sql.Connection
做了层封装,覆写了 finalize
方法,在里面把 Connection
关闭了。
一个同事调用的方法定义是用封装类作为入参,他调用的时候是直接 new 了一个封装类,把 connection 传进去,后续数据库操作就不定位置出现连接关闭的异常。原因就是这个临时 new 出来的封装类被垃圾回收,把 connection 关闭了。由于垃圾回收的时间是不确定的,所以报异常的时间点也不确定。
欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。