java中的4种引用和GC Roots

189 阅读5分钟
原文链接: www.cnblogs.com
小小鱼儿yz
博客园     首页     新随笔     新文章     联系    订阅 订阅     管理 posts - 19,comments - 0,trackbacks - 0
< 2020年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

昵称: 小小鱼儿yz
园龄: 2年1个月
粉丝: 2
关注: 4 +加关注

搜索

   

常用链接

随笔档案

阅读排行榜

java中的4种引用和GC Roots

juejin.cn/post/1?utm_…

1.首先,四种引用如下:

  • FinalReference 强引用
  • SoftReference 软引用
  • WeakReference 弱引用
  • PhantomReference 虚引用

2.四种引用的特点:

强引用:被new出来的对象都是的引用都是强引用

              eg:Student s = new Student();

               回收时机:不会被回收,会发生内存溢出。

 

 

软引用:软引用关联的对象,在内存不够的情况下,会把这些软引用关联的对象列入垃圾回收范围中,然后进行回收,也就是说软引用并非是完全安全的,在内存不够的情况下是会被垃圾回收器回收掉的。

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public static void main(String[] args) {     SoftReference[] references = new SoftReference[ 5];     ReferenceQueue<ReferenceTestObject> referenceTestObjectReferenceQueue = new ReferenceQueue<>();     for(int i = 0 ;i<5;i++){         references[i] = new SoftReference( new ReferenceTestObject("ahahh-"+i),referenceTestObjectReferenceQueue);     }       for(int i = 0 ;i<5;i++){         Object o = references[i].get();         if(o == null ){             System.out.println("null" );         }else{             System.out.println(((ReferenceTestObject)o).name);         }     } }

  

使用场景:使用软引用来保存从数据库中取出的数据,具体是做了一个中间层的封装,该中间层的作用就是在get出数据的时候会去判断数据是否为null,如果是为null再次从数据库读取,读取后再放入软引用的集合中,这样的做法是可以避免内存溢出

 

弱引用:只要发生GC都会被回收掉

eg:ThreadLocalMap的key

    static class ThreadLocalMap {

        /**
         * The entries in this hash map extend WeakReference, using
         * its main ref field as the key (which is always a
         * ThreadLocal object).  Note that null keys (i.e. entry.get()
         * == null) mean that the key is no longer referenced, so the
         * entry can be expunged from table.  Such entries are referred to
         * as "stale entries" in the code that follows.
         */
        static class Entry extends WeakReference<ThreadLocal<?>> {
            /** The value associated with this ThreadLocal. */
            Object value;

            Entry(ThreadLocal<?> k, Object v) {
                super(k);
                value = v;
            }
        }
    ......}

 

虚引用
有和没有一个样:无法通过虚引用来获取对象的实例,但是还是有作用的。、
作用就是能在这个对象被收集器回收时收到一个系统通知,实现追踪垃圾收集器的回收动作,比如在对象被回收的时候,会调用该对象的finalize方法。

 

ReferenceQueue 引用队列

在创建Reference时,手动将Queue注册到Reference中,而当该Reference所引用的对象被垃圾收集器回收时,JVM会将该Reference放到该队列中,而我们便可以对该队列做些其他业务,相当于一种通知机制。

 

可达性分析:

JVM怎么知道引用在不在,这就涉及到了JVM的可达性分析算法了 JVM的可达性分析算法的简单思路就是通过一系列GC Roots作为出发点,向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链,即表明从GC Roots到这个对象不可达时,证明此对象不可用,可被回收。如下图所示

 

 

对象4、5、6都是可被回收的。 那么问题来了,哪些对象可以作为GC Roots呢? 这里给出几个,如下

  • 虚拟机栈中引用的对象

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

  • 方法区中常量引用的对象

  • 本地方法栈JNI引用的对象

 

posted on 2019-06-18 11:21  小小鱼儿yz  阅读(312)  评论(0)  编辑  收藏 刷新评论刷新页面返回顶部 注册用户登录后才能发表评论,请 登录注册访问 网站首页。 【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
【推荐】阿里云双11返场来袭,热门产品低至一折等你来抢!
【活动】开发者上云必备,腾讯云1核4G 2M云服务器11元/月起
【推荐】百度智能云岁末感恩季,明星产品低至1元新老用户畅享
【活动】京东云限时优惠1.5折购云主机,最高返价值1000元礼品!
Copyright © 2020 小小鱼儿yz
Powered by .NET Core 3.1.0 on Linux Powered By博客园 模板提供:沪江博客