zoukankan      html  css  js  c++  java
  • 释放对象的引用

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

    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还在引用该对象

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

  • 相关阅读:
    【个人博客设计】
    复杂多边形光栅化算法
    xmake 描述语法和作用域详解
    协程分析之context上下文切换
    tbox协程使用之切换与等待
    记boost协程切换bug发现和分析
    跨平台自动构建工具v1.0.2 发布
    xmake从入门到精通9:交叉编译详解
    xmake从入门到精通9:交叉编译详解
    跨平台c开发库tbox:内存库使用详解
  • 原文地址:https://www.cnblogs.com/do-hardworking/p/10468288.html
Copyright © 2011-2022 走看看