finalize
finalize的做用性能
- finalize()是Object的protected方法,
- 子类能够覆盖该方法以实现资源清理工做,
- GC在回收对象以前调用该方法。
大体描述一下finalize流程:spa
- 当对象变成(GC Roots)不可达时,GC会判断该对象是否覆盖了finalize方法,
- 若未覆盖,则直接将其回收。
- 不然,若对象未执行过finalize方法,将其放入F-Queue队列,
- 由一低优先级线程执行该队列中对象的finalize方法。
- 执行finalize方法完毕后,
- GC会再次判断该对象是否可达,
- 若不可达,则进行回收,
- 不然,对象“复活”。
finalize的问题
- 一些与finalize相关的方法,
- 因为一些致命的缺陷,已经被废弃了,
- 如System.runFinalizersOnExit()方法、Runtime.runFinalizersOnExit()方法
- System.gc()与System.runFinalization()方法
- 增长了finalize方法执行的机会,但不可盲目依赖它们
- Java语言规范并不保证finalize方法会被及时地执行、
- finalize方法可能会带来性能问题。
- 由于JVM一般在单独的低优先级线程中完成finalize的执行
- 对象再生问题:finalize方法中,
- 可将待回收对象赋值给GC Roots可达的对象引用,从而达到对象再生的目的
- finalize方法至多由GC执行一次(用户固然能够手动调用对象的finalize方法,但并不影响GC对finalize的行为)
欢迎关注本站公众号,获取更多信息