• 释放对象的引用


    一个局部变量的生命周期只存在于其自身类中。如下的例子可以发现,局部变量只能存在于声明该变量的方法中。

    public class TestLifeOne {
        public void  read() {
            int s=42;        //s只能限于read()中使用,别处无法使用
            sleep();
        }
        public void sleep() {
            s=7;    //s在此处无法使用
        }
    
    }

    对于实例变量,其寿命与对象的寿命相同。对象未“死”,实例变量也未“死”。

    public class TestLifeOne {
        
        int size;
        
        public void sleep(int s) {
            size=s;     //s会在方法结束时消失,但是size在类TestLifeOne中处处可以使用。
        }
    
    }

    引用变量如果活着,那么对象也会活着,当对对象的引用死了,那么该对象也会从堆上被踢开,变成垃圾被垃圾收集器(GC)所回收。

    有三种方法释放对象的引用,当最后一个引用消失时,对象就会变成可回收的。

     1     void go() {        //引用永久性地离开它的范围
     2         Life z=new Life();  //z会在方法结束时消失
     3     }
     4     
     5     //引用z被赋值到其他对象上时
     6     Life z=new Life();    
     7     z=new Life();        //此处,第一个Life对象会在z被赋值到别处时消失
     8     
     9     //直接将引用z设定为null
    10     Life z=new Life();
    11     z=null;                //此处,第一个Life对象在z被赋值为null时消失

     在如下代码中插入一条代码,会有哪些是使某一个额外对象被认为是可以垃圾回收的?

        GC gc1;
        GC gc2=new GC();
        GC gc3=new GC();
        GC gc4=gc3;
        gc1=new GC();
        
        //在上述代码下加入以下一行代码,会使一个额外的对象被认为是可回收的垃圾吗?
        gc2=null;          //会,gc2是唯一引用,因此其对象会被回收
        gc1=null;        //同上
        gc4=null;        //不会,还有gc3引用gc4的对象,因此不会被回收
        gc3=gc2;        //不会,还有gc4引用gc3的对象,因此不会被回收
        gc1=gc4;        //会,重新给对象引用赋值
        gc3=null;        //不会,gc4还在引用该对象

    这个要想通其实画一个对象引用的箭头图就能明白了。

  • 相关阅读:
    Docker安装
    MVC-HtmlHelper简单总结
    D3.js
    分布式事务seata
    彻底搞懂JAVA路径问题
    idea 代码生成
    自动生成 serialVersionUID 的设置
    狂神说SSM框架系列连载
    缓存穿透、缓存击穿、缓存雪崩区别和解决方案
    多线程
  • 原文地址:https://www.cnblogs.com/do-hardworking/p/10468288.html
Copyright © 2020-2023  润新知