• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Loneliness Ends HUHU
热情坦诚
博客园    首页    新随笔    联系   管理    订阅  订阅
GC Root

                    GC Root

       GC Root:常说的GC(Garbage Collector) roots,特指的是垃圾收集器(Garbage Collector)的对象,GC会收集那些不是GC roots且没有被GC roots引用的对象。

    GC Root 引用的对象:

        1.虚拟机栈中引用的对象

        2.方法区中类静态属性引用的对象

        3.方法区常量引用的对象

        4.本地方法栈中JNI引用的对象(Native方法)

    简单的用衣服图来表达一下:

        

   留心脚下:

     判断一个对象的存活不是有计数器判断,因为计数器无法解对象之间的相互循环引用问题,一个对象的存活可以使用可达性分析算法来判断。

  可达性分析算法:

    

    

    一次对象自我拯救的演示:

 1 package com.hehe;
 2 
 3 public class Main {
 4 
 5 
 6     public static Main save = null;
 7 
 8     public void isAlive() {
 9         System.out.println("yes,i am still alive:)");
10     }
11 
12     @Override
13     protected void finalize() throws Throwable {
14         super.finalize();
15         System.out.println("finalize method executed");
16         Main.save = this;
17     }
18 
19     public static void main(String[] args) throws Throwable {
20         save = new Main();
21 
22         //对象的第一次拯救
23         save=null;
24         System.gc();
25         //finalize方法优先级很低,所以暂时等待0.5秒
26         Thread.sleep(500);
27         if (save != null) {
28             save.isAlive();
29         } else {
30             System.out.println("no , i am dead;(");
31         }
32 
33         //第二次拯救:失败,因为任何一个对象的finalize方法都只会被系统调用一次
34         save = null;
35         System.gc();
36         if (save != null) {
37             save.isAlive();
38         } else {
39             System.out.println("no,i am dead :))");
40         }
41     }
42 }

运行结果:

     

 

posted on 2018-05-29 08:22  meiLinYa  阅读(1589)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3