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的行为)
相关文章
相关标签/搜索