1. public class FinalizeTest {
  2. public static FinalizeTest obj = null;
  3. public static void main(String[] args) throws Exception {
  4. obj = new FinalizeTest();
  5. obj = null;
  6. // 这两句保证进行垃圾回收标记, finalize能进行挽救自己
  7. System.gc();
  8. //因为finalize方法优先级很低,所以暂停1秒等待它
  9. Thread.sleep(1000);
  10. if (obj == null) {
  11. System.out.println("obj 死亡1");
  12. } else {
  13. // 这里被执行,成功挽救自己
  14. System.out.println("obj 存活1");
  15. }
  16. // 一样的的代码
  17. obj = null;
  18. System.gc();
  19. //因为finalize方法优先级很低,所以暂停1秒等待它
  20. Thread.sleep(1000);
  21. if (obj == null) {
  22. // 这里被执行, 无法挽救,finalize只能执行一次
  23. System.out.println("obj 死亡2");
  24. } else {
  25. System.out.println("obj 存活2");
  26. }
  27. Thread.sleep(1000000000);
  28. }
  29. @Override
  30. protected void finalize() throws Throwable {
  31. super.finalize();
  32. obj = this;
  33. System.out.println("触发 finalize");
  34. }
  35. }

image.png

关于:Object对象的finalize()方法

  1. 调用finalize()方法的时机:当JVM确定不再有指向该对象的引用时,垃圾收集器在对象上调用该方法。
  2. finalize()方法的作用:JVM调用该方法,表示该对象即将死亡,之后JVM就可以回收该对象了。有点类似对象声明周期的临终方法。
  3. 通过使用finalize方法可以实现对象的自我拯救,但是只能拯救一次。
  4. 打开jvisualvm查看Finalizer线程。