当对象不馁引用的时候,这个对象就是死亡的,等待GC进行回收。

1.引用计数法

概念:

给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就增加1;当应用失效时,计数器值就减1;任何时刻计数器为0是对象就是不可能再被使用的。

但是:

主流的java虚拟机并没有选用引用计数器算法,其中一个最主要的原因是:它很难解决对象之间是相互循环引用。

优点:算法的实现简单,判定效率高,大部分情况下是一个不错的算法。很多地方应用到它

缺点:

引用和去引用伴随假发和减法,影响性能。

致命的缺陷:对于循环引用的对象无法进行回收。

2.根搜索算法(JVM采用的算法)

概念:设立若干种根对象,当任何一个根对象(GC Root)到某一个对象均不可达时,则认为这个对象是可以被回收的。

注意:这里提到,设立若干种根对象,当任何一个根对象到某一个对象均不可达时,则认为这个对象是可以被回收的。

可达性分析:

从根(GC root)的对象作为起始点,开始向下搜索,搜索所走过的路径称为“引用链”,当一个对象到GC root没有任何引用链相连(用凸轮的概念来讲,就是从GC Root到这个对象不可达)时,则证明此对象是不可用的。

如上图所示,ObjectD和ObjectE是互相关联的,但是由于GC root到这两个对象不可达,所以最终D和E还是会被当做GC的对象,上图若是采用引用计数法,则A-E五个对象都不会被回收。

根(GC roots)

说到GC roots(GC根),在Java语言中,可以当做GC root的对象有以下几种:

1.栈(栈帧的本地变量表)中引用的对象

2.方法区中的静态成员。

3.方法区中的常量引用的对象(全局变量)

4.本地方法栈中JNI(一般说是Native方法)引用的对象。

注意:第一和第四都是指的方法的本地变量表,第二种表达的意思比较清晰,第三种主要指的是生命为final的常量值。

在根搜索算法的基础上,现在虚拟机的实现当中,垃圾收集的算法主要有三种,分别是标记-清除算法,复制算法,标记着呢管理算法。这三种算法都扩充了根搜索算法,不过他们理解起来还是非常好理解的。

判断Java对象死亡的两种常用算法的更多相关文章

  1. Java中对象拷贝的两种方式

    引用的拷贝 //引用拷贝 private static void copyReferenceObject(){ Person p = new Person(23, "zhang") ...

  2. Java实现单例模式的两种方式

    单例模式在实际开发中有很多的用途,比如我们在项目中常用的工具类,数据库等资源的连接类.这样做的好处是避免创建多个对象,占用内存资源,自始自终在内存中只有一个对象为我们服务. 单例对象一般有两种实现方式 ...

  3. java线程池和五种常用线程池的策略使用与解析

    java线程池和五种常用线程池策略使用与解析 一.线程池 关于为什么要使用线程池久不赘述了,首先看一下java中作为线程池Executor底层实现类的ThredPoolExecutor的构造函数 pu ...

  4. java线程池与五种常用线程池策略使用与解析

    背景:面试中会要求对5中线程池作分析.所以要熟知线程池的运行细节,如CachedThreadPool会引发oom吗? java线程池与五种常用线程池策略使用与解析 可选择的阻塞队列BlockingQu ...

  5. 从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射

    从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射.Collection 接口又有 3 ...

  6. [Java] HashMap遍历的两种方式

    Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml第一种: Map map = new HashMap( ...

  7. 【转载】JAVA中线程的两种实现方法-实现Runnable接口和继承Thread类

    转自: http://blog.csdn.net/sunguangran/article/details/6069317 非常感谢原作者,整理的这么详细. 在java中可有两种方式实现多线程,一种是继 ...

  8. 判断Java对象存活的算法、垃圾回收算法

    判断Java对象存活的算法 一.引用计数算法 给对象添加一个引用计数器,每当一个地方引用它的时候就将计数器加1,当引用失效的时候就将计数器减1,任何时刻计数器为0的对象都不可再被使用.这种算法虽然简单 ...

  9. java中线程分两种,守护线程和用户线程。

    java中线程分为两种类型:用户线程和守护线程. 通过Thread.setDaemon(false)设置为用户线程: 通过Thread.setDaemon(true)设置为守护线程. 如果不设置次属性 ...

随机推荐

  1. 0522 HTML表单 CSS基础

    一.列表标签 列表标签分为三种. 1.无序列表<ul>,无序列表中的每一项是<li> 英文单词解释如下: ul:unordered list,“无序列表”的意思. li:lis ...

  2. 20145210姚思羽《网络对抗》——shellcode注入& Return-to-libc攻击深入

    20145210姚思羽<网络对抗>shellcode注入&Return-to-libc攻击深入 shellcode基础知识 Shellcode是一段代码,作为数据发送给受攻击服务器 ...

  3. Delphi 的类型与指针

    Delphi 的指针分为 "类型指针" 和 "无类型指针" 两类.Delphi 中的类型, 常用的也得有几百个, 我们可以给每种类型定义相应的类型指针.其实 D ...

  4. 《python基础教程(第二版)》学习笔记 基础部分(第1章)

    <python基础教程(第二版)>学习笔记 基础部分(第1章)python常用的IDE:Windows: IDLE(gui), Eclipse+PyDev; Python(command ...

  5. sqlserver 2008 创建数据库的时候不是空库,里面总有数据的解决办法

    SqlServer2008 里面有个系统数据库 Model 数据库,在创建新数据库的时候,会以它为模板创建,所以如果发现你的Model数据库比较大,说明里面有很多模板数据.此时如果需要去创建没有数据的 ...

  6. pathinfo()的用法

    pathinfo() 返回一个关联数组包含有 path 的信息. 包括以下的数组元素: [dirname] [basename] [extension] 提示和注释 注释:如果不是要求取得所有单元,则 ...

  7. linux 磁盘管理与文件系统

    一.磁盘分区的意义 磁盘分区就是为了将磁盘分成不同的逻辑区域,每个分区可以有不同的文件系统 二. 磁盘分区是按照磁盘的柱面进行分区的,由于盘片在转动时的角速度都是一样的,所以磁头在最外层的磁道上读取信 ...

  8. Linux课程---1、VMWare安装CentOS虚拟机(安装重要注意)

    Linux课程---1.VMWare安装CentOS虚拟机(安装重要注意) 一.总结 一句话总结: 可以先去百度搜一篇对应系统的安装教程:比如 CentOS 7 安装 1.安装VMWare之后,打开w ...

  9. php:如何使用PHP排序, key为字母+数字的数组(多维数组)

    你还在为如何使用PHP排序字母+数字的数组而烦恼吗? 今天有个小伙伴在群里问:如何将一个key为字母+数字的数组按升序排序呢? 举个例子: $test = [ 'n1' => 22423, 'n ...

  10. 十 Django框架,Cookie

    注意:获取Cookie是在请求对象里处理,设置Cookie是在响应对象里处理 普通Cookieset_cookie()设置普通cookie 参数: key, 键 value='', 值 max_age ...