判断Java对象死亡的两种常用算法
当对象不馁引用的时候,这个对象就是死亡的,等待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对象死亡的两种常用算法的更多相关文章
- Java中对象拷贝的两种方式
引用的拷贝 //引用拷贝 private static void copyReferenceObject(){ Person p = new Person(23, "zhang") ...
- Java实现单例模式的两种方式
单例模式在实际开发中有很多的用途,比如我们在项目中常用的工具类,数据库等资源的连接类.这样做的好处是避免创建多个对象,占用内存资源,自始自终在内存中只有一个对象为我们服务. 单例对象一般有两种实现方式 ...
- java线程池和五种常用线程池的策略使用与解析
java线程池和五种常用线程池策略使用与解析 一.线程池 关于为什么要使用线程池久不赘述了,首先看一下java中作为线程池Executor底层实现类的ThredPoolExecutor的构造函数 pu ...
- java线程池与五种常用线程池策略使用与解析
背景:面试中会要求对5中线程池作分析.所以要熟知线程池的运行细节,如CachedThreadPool会引发oom吗? java线程池与五种常用线程池策略使用与解析 可选择的阻塞队列BlockingQu ...
- 从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射
从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射.Collection 接口又有 3 ...
- [Java] HashMap遍历的两种方式
Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml第一种: Map map = new HashMap( ...
- 【转载】JAVA中线程的两种实现方法-实现Runnable接口和继承Thread类
转自: http://blog.csdn.net/sunguangran/article/details/6069317 非常感谢原作者,整理的这么详细. 在java中可有两种方式实现多线程,一种是继 ...
- 判断Java对象存活的算法、垃圾回收算法
判断Java对象存活的算法 一.引用计数算法 给对象添加一个引用计数器,每当一个地方引用它的时候就将计数器加1,当引用失效的时候就将计数器减1,任何时刻计数器为0的对象都不可再被使用.这种算法虽然简单 ...
- java中线程分两种,守护线程和用户线程。
java中线程分为两种类型:用户线程和守护线程. 通过Thread.setDaemon(false)设置为用户线程: 通过Thread.setDaemon(true)设置为守护线程. 如果不设置次属性 ...
随机推荐
- 2014年互联网IT待遇
1. 13k*14~16k*145.美团 13k*15~16k*15,也有更高的.6.去哪儿 11k*16~15k*167.人人技术类(12K-14K)*14 (2014)8.58同城 20w+9.网 ...
- 剑指offer——二叉树的深度与平衡二叉树的判断
通过后续遍历,可以减少重复访问 #include <iostream> #include <string> using namespace std; struct Binary ...
- runtime 实现方法交换 viewwillappear方法
1.新建分类 #import "UIViewController+swizzling.h"#import <objc/runtime.h> @implementatio ...
- castle windsor学习-----XML Inline Parameters 内联参数
当使用XML配置的时候,可能要给组件指定各种各样的依赖 1.简单的参数 参数名称不区分大小写 <component id="ping" type="Acme.Crm ...
- Oracle的select检索数据
--Select语法 select [distinct | All] select_list from table_list [where_clause] [group_by_clause] [Hav ...
- github之克隆
git clone --depth=10 git_仓库_url 只会获取最近 xx(10条提交记录的)代码,默认是master分支, 如果想要指定分支,可以结合 -b --single--branch ...
- html转义字符及css清除
1. [代码][Java]代码 import java.util.HashMap;import java.util.Map; import org.apache.commons.lang3. ...
- 一张图理解is_nll isset empty
isset 判断变量是否已存在,如果变量存在则返回 TRUE,否则返回 FALSE. empty 判断变量是否为空,如果变量是非空 或非零 的值,则 empty() 返回 FALSE.换句话说,&qu ...
- 仿联想商城laravel实战---2、后端页面搭建(验证码如何在页面中使用)
仿联想商城laravel实战---2.后端页面搭建(验证码如何在页面中使用) 一.总结 一句话总结: 放在img里面,img的src就是生产验证码的控制器路径: img src="/admi ...
- hdu 2041 超级楼梯(简单dp)
超级楼梯 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...