`
dbp_cn
  • 浏览: 82231 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

怎么判断对象已死

 
阅读更多

堆中几乎存放这Java世界中所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象有哪些还"存活"着,哪些已经"死去"(即不可能再被任何途径使用的对象)。

1,引用计数算法

  给对象添加一个引用计数器,每当有一个地方引用它时,计数器就加1;当引用失效时,计数器就减1;任何时刻计数器都为0的对象就是不可能再被使用的。客观地讲,引用计数法的实现简单,判定效率也高,但Java中没有选用其来管理内存,其中最主要的原因是它很难解决对象之间的相互循环引用的问题。

 例子:

   如下代码,对象objA和objB都有字段instance,赋值令objA.instance=objB 及objB.instance=objA,除此之外,这量个对象再无任何引用,但是他们之间因为相互引用着对方,导致它们的引用计数都不为0,于是引用计数法无法通知GC收集器回收它们。 

public class RefGC{
    
    public Object instance=null;
    private static final int _1MB=1024*1024;

   //给变量赋予一定内存,
    private byte[] bigSize=new byte[2 * _1MB];
  
  public static void tesetGC(){
     RefGC objA=new RefGC();
     RefGC objB=new RefGC();
     objA.instance=objB;
    objB.instance=objA;
   
   objA=null
   objB=null;

   System.gc();
  }
}

  2,跟搜索算法 

    在主流的商用程序语言中,都是使用根搜索算法(GC Root Tracing)判定对象是否存活的。这个算法的基本思路是通过一系列的名为"GC Roots"的对象作为起点,从这些结点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC roots 没有任何引用链相连时,则证明次对象是不可用的。

    在Java 语言里,可作为GC Roots的对象包括 :

   1)虚拟机栈(栈桢中的本地变量表)中引用的对象。

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

   3)方法区中的常量引用的对象

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

分享到:
评论

相关推荐

    JVM的GC如何判断对象是否死亡?

    这节我们主要讲垃圾收集的一些基本概念,先了解垃圾收集是什么、然后触发条件是什么、最后虚拟机如何判断对象是否死亡。 一、前言   我们都知道Java和C++有一个非常大的区别就是Java有自动的垃圾回收机制,经过半...

    【05-面向对象(下)】

    •Object类提供的equals方法判断两个对象相等的标准与==完全相同。因此开发者通常需要重写equals方法。 类成员 •在java类里只能包含Field,方法,构造器,初始化块,内部类(接口、枚举)等5种成员。 用...

    java多线程下载

    4.为了杀死线程还能继续下载的情况下,从本地文件上读取已经下载文件的开始位置 a)创建保存记录结束位置的文件 b)读取文件 c)将流转换为字符 d)获取记录位置 e)把记录位置赋给开始位置 5.当你的n个线程都下载完毕的...

    Java 小项目 飞机大战源码(已测试无BUG)

    /** 判断是否死了的 */ public boolean isDead(){ return state==DEAD; } /** 判断是否删除的 */ public boolean isRemove(){ return state==REMOVE; } /** 画对象 g:画笔 */ public void paintObject...

    很好的五子棋 MFC

    判断是否能成活4或者是双死4或者是死4活3,如果是机器方的话给予10000分,如果是人方的话给予-10000分; 判断是否已成双活3,如果是机器方的话给予5000分,如果是人方的话给予-5000 分; 判断是否成死3活3,...

    JAVA基础课程讲义

    String类的常用方法(已讲过,不再讲!) 120 StringBuffer和StringBuilder 121 String和StringBuffer和StringBuilder使用要点 123 时间处理相关类 124 Date时间类(java.util.Date) 124 DateFormat类和...

    21天学通Java-由浅入深

    108 6.6 对象引用的使用 110 6.6.1 调用不存在的对象或成员变量 110 6.6.2 调用对象为null值的引用 111 6.6.3 对象引用间的比较 113 6.7 this 113 6.8 要活用JDK已有的类 114 6.8.1 Date类 114 6.8.2 Integer类 116 ...

    C++网络爬虫项目

    始人埃文•威廉姆斯提出了“域名已死论”,好记的域名不再重要,因为人们会 通过搜索进入网站。搜索引擎排名对于中小网站流量来说至关重要。了解搜索 引擎简单界面背后的技术原理其实对每一个希望在互联网行业有所...

    Java 虚拟机面试题全面解析(干货)

    如何判断对象是否“死去”? 1.引用计数法 2.根搜索算法 什么是引用计数法? 给对象添加一个引用计数器,每当有一个地方引用它,计数器就+1,;当引用失效时,计数器 就-1;任何时刻计数器都为0的对象就是不能再被使用的 ...

    精易模块[源码] V5.15

    5、改善“网页_访问”死循环代码,感谢易友[@67564226]反馈。 6、优化“文本_取随机数字”精简代码,提高执行效率,感谢易友[ds9660]反馈。 7、修正“普通填表->链接_点击”无法在本窗口中打开的BUG,感谢易友[@zhuan...

    C#编程经验技巧宝典

    79 <br>0115 如何判断是否为数字 79 <br>0116 如何在字符串中查找指定字符 79 <br>0117 如何在字符串中用一子串替换另一子串 80 <br>0118 将新字符串添加到已有字符串中 80 <br>0119 如何在...

    经典全面的SQL语句大全

     根据已有的表创建新表: A:create table tab_new like tab_old (使用旧表创建新表) B:create table tab_new as select col1,col2… from tab_old definition only C: select * into table2 from table  5、说明...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    与我一同工作的同志对本研究所做的任何贡献均已在论文中作了明确的说明并表示了谢意。 研究生签名: 日期: 东南大学学位论文使用 授权声明 东南大学、中国科学技术信息研究所、国家图书馆有权保留本人...

    测试覆盖率

    这些分析类型分别为揭示软件可靠性的缺陷趋势或缺陷分布提供了判断依据。  例如,预期缺陷发现率将随着测试进度和修复进度而最终减少。可以设定一个阈值,在缺陷发现率低于该阈值时才能部署软件。也可根据执行模型...

    易语言程序免安装版下载

     为实现静态编译,易语言编译器、核心支持库、集成开发环境(IDE)等均有重大更新,支持库开发架框有扩展性调整,绝大多数官方支持库都已针对静态编译完成自身改造并提供静态库。  目前绝大多数官方支持库均已支持...

    C#开发经验技巧宝典

    0977 从DataReader对象读取数据的技巧 569 0978 随机显示数据库记录 569 0979 通过DataTable获得数据表的主键 569 0980 将Access数据库转化为SQL Server数据库 570 0981 将SQL Server数据库转化为Access...

    入门学习Linux常用必会60个命令实例详解doc/txt

    在使用mount这个指令时,至少要先知道下列三种信息:要加载对象的文件系统类型、要加载对象的设备名称及要将设备加载到哪个目录下。 (1)Linux可以识别的文件系统 ◆ Windows 95/98常用的FAT 32文件系统:vfat ;...

    网管教程 从入门到精通软件篇.txt

     bootcfg /list 列出引导列表中已有的条目。  bootcfg /disableredirect 在启动引导程序中禁用重定向。  bootcfg /redirect [ PortBaudRrate] |[ useBiosSettings]  在启动引导程序中通过指定配置启用重定向...

Global site tag (gtag.js) - Google Analytics