Java中引用级别详解

介绍

在Java中操作对象都需要用到引用类似于C++中的指针,可以说在Java语言中无时无刻不在和引用打交道在Java 1.2版本中就加入了四种不同级别的引用供开发人员使用,分别是强应用 软引用 弱引用 幽灵引用 强度从高到低。

引用级别作用

引用级别的高低起到了JVM在内存不足的时候,进行GC操作是否需要回收这个对象的作用。

强引用

强引用在开发中是使用最为普遍的引用级别,当使用new obj关键字创建了对象后,这个对象就属于强引用了。 如果JVM在内存不足情况下进行垃圾回收操作时遇到了强引用的对象,JVM就算抛出OutOfMemoryError错误导致程序终止,也不会去回收一个具有强引用级别的对象来解决内存不足的问题。

创建一个DataTest类覆盖object的finalize方法,finalize是当GC回收当前对象的时候会调用,但是不一定每次都会调用。

    class DataTest extends Object {

            @Override
            protected void finalize() throws Throwable {
                super.finalize();
                System.out.println("--------obj is gc--------");
            }
        }

模拟大量消耗内存

    public static void drainMemory() {
            String[] array = new String[1024 * 10];
            for(int i = 0; i < 1024 * 10; i++) {
                for(int j = 'a'; j <= 'z'; j++) {
                    array[i] += (char)j;
                }
            }
        }

测试

      @Test
      public void onRTre() {
          DataTest dataTest = new DataTest();
          drainMemory();
      }

运行结果: 消耗了大量内存也没有回收对象
无任何输入

把引用赋为null

      @Test
       public void onRTre() {
           DataTest dataTest = new DataTest();
           dataTest=null;
           drainMemory();

       }

运行结果: 隐式GC消耗大量内存导致内存不足,回收了无引用对象
--------obj is gc--------


 @Test
       public void onRTre() {
           DataTest dataTest = new DataTest();
           dataTest=null;
           System.gc();

       }

运行结果: 显式GC操作,虽然内存足够也回收了无引用对象。
--------obj is gc--------

软引用

具有软引用的对象,当JVM内存足够的情况下是不会回收它,当内存不足情况下GC操作JVM就会回收具有软引用的对象,软引用可以用来做那些需要缓存的操作,当JVM内存不足的时候这些缓存可以被GC掉。

       @Test
       public void onRTre() {
          SoftReference reference = new SoftReference(new DataTest());
          drainMemory();

       }

运行结果:运行五次,有一次输出。说明GC遇到软引用的时候是由JVM运行情况决定,是否需要回收软引用对象,内存不足有可能会回收也有可能不会被回收。如果当前对象被GC对象就不能被使用了,否则可以继续使用。
--------obj is gc--------

弱引用

弱引用级别的对象,只有JVM进行GC操作的时候遇到是弱引用级别,不管内存是否足够都会把对象GC掉。不过由于GC是在一个级别很低的线程,所以不一定能马上发现那些弱引用的对象。

       @Test
        public void onRTre() {
            WeakReference reference = new WeakReference(new DataTest());
            System.gc();

        }

运行结果:有输出
进行GC操作虽然内存足够,但是对象也被回收了。
--------obj is gc--------

虚引用

这个级别的引用是最低的,具有这个级别的引用和没被引用一样,随时都有可能被GC掉。虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中。

       @Test
       public void onRTre() {
            PhantomReference reference = new PhantomReference(new DataTest(),new ReferenceQueue());
            System.gc();

        }

运行结果:有输出进行GC操作虽然内存足够,但是对象也被回收了。
--------obj is gc--------

总结

根据上面的实验结果可以得出下面的区别

级别 回收时机 用途 存活时间
强引用 从来不会 一般使用 JVM终止时
软引用 在内存不足时 一般时候或者缓存 内存不足时
弱引用 垃圾回收时 一般使用或者对象缓存 GC操作时终止
虚引用 未知 未知 未知
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容