关于 java 的 finalize() 方法,Finalizer类, Finalizer 线程, 以及这些对象的GC

  1. 若一个类实现Object类的 finalize() 方法, 当去实例化这个类当时候,JVM会自动创建一个Finalier实例;
  2. 这个Finalizer实例会refer 这个带有finalize的实例,并且这个Finalizer类会自动被加到一个全是Finalizer的链表结构中;
  3. Finalizer 类有个static的ReferenceQueue的队列, 这个队列里面存的是上面提到的Finalizer. 当且仅当没有其它对象引用这个带有finalize()方法的对象, 仅剩一个Finalizer引用它的时候, 它对应的这个Finalizer 就会被GC 线程加入这个queue.
  4. 还有一个Finalizer 线程, 它会从上面提到的这个block ReferenceQueue中拿Finalizer, 然后去执行它对应实例的finalize() 方法, 然后从队列中去除它;
  5. Finalizer 线程相对于其它线程, 优先级比较低, 所以有竞争时分配的时间比较少;
  6. 更多实例 参看: https://plumbr.io/blog/garbage-collection/debugging-to-understand-finalizer

标签: none

添加新评论