判断Java中对象存活的算法以及Java中存在的几种引用
2017-04-01 11:23
357 查看
判断Java中对象存活的算法:
(1)引用计数算法:给对象中添加一个引用计数器,每当一个地方引用它的时候就将计数器加1,当引用失效的时候就将计数器减一;任何时刻计数器为0的对象都是不可能在被使用的。这中方法的实现简单,判断效率也高,在大部分情况下是个不错的算法,有一些比较有名的应用案例,但是至少主流的Java虚拟机里面没有选用引用计数算法来管理内存,其中最重要的原因是它很难解决对象之间循环引用的问题;
(2)可达性分析算法:基本思路就是通过一系列的称为“GC Roots”对象作为起始点,从这些节点开始往下搜索,搜索走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连的时候(用图论的话说就是从GC Roots到这个对象不可达),则证明此对象是不可用的。
在Java中可作为GC Roots的对象包括以下几种:
1、虚拟机栈(栈帧中的本地变量表)中引用的对象;
2、方法区中类静态属性引用的对象;
3、方法区中常量引用的对象;
4、本地方法栈中JNI(即一般说的Native方法(本地方法))引用的对象。
Java中存在的几种引用:
1、在JDK1.2之前,Java中引用的定义很传统:如果reference类型的数据中存储的数值代表的是另一块内存的地址,就称这块内存代表着一个引用。
2、在JDK1.2之后,将引用分为四种:强引用(Strong Reference),软引用(Soft Reference),弱引用(Weak Reference),虚引用(Phantom Reference),且强度依次减弱:
(1)强引用:指在程序代码中国普遍存在的,类似于“Object object=new Object()”这类的引用,只要强引用还存在,GC就永远不会回收掉被引用的对象;
(2)软引用:用来描述一些有用但是非必须的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行第二次回收。如果这次回收还没有足够的内存,才会跑出内存溢出异常,在JDK1.2后有SoftReference 实现软引用。
(3)弱引用:用来描述非必须对象,但是其强度比软引用更弱一些,被弱引用关联的对象只能生存岛下一次垃圾收集发生之前。当GC工作时,无论当前内存是否足够,都会回收掉只被软引用关联的对象。JDK1.2之后提供了WeakReference类来实现弱引用。
(4)虚引用:也称幽灵引用或者幻影引用,他是最弱的一种引用关系。一个对象是否有虚引用的存在我拿全部会对其生存时间构成影响,也无法通过虚引用来取得一个度喜爱你那个的实例。兑一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。 在JDK1.2后提供了PhantomReference 类来实现虚引用。
(1)引用计数算法:给对象中添加一个引用计数器,每当一个地方引用它的时候就将计数器加1,当引用失效的时候就将计数器减一;任何时刻计数器为0的对象都是不可能在被使用的。这中方法的实现简单,判断效率也高,在大部分情况下是个不错的算法,有一些比较有名的应用案例,但是至少主流的Java虚拟机里面没有选用引用计数算法来管理内存,其中最重要的原因是它很难解决对象之间循环引用的问题;
(2)可达性分析算法:基本思路就是通过一系列的称为“GC Roots”对象作为起始点,从这些节点开始往下搜索,搜索走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连的时候(用图论的话说就是从GC Roots到这个对象不可达),则证明此对象是不可用的。
在Java中可作为GC Roots的对象包括以下几种:
1、虚拟机栈(栈帧中的本地变量表)中引用的对象;
2、方法区中类静态属性引用的对象;
3、方法区中常量引用的对象;
4、本地方法栈中JNI(即一般说的Native方法(本地方法))引用的对象。
Java中存在的几种引用:
1、在JDK1.2之前,Java中引用的定义很传统:如果reference类型的数据中存储的数值代表的是另一块内存的地址,就称这块内存代表着一个引用。
2、在JDK1.2之后,将引用分为四种:强引用(Strong Reference),软引用(Soft Reference),弱引用(Weak Reference),虚引用(Phantom Reference),且强度依次减弱:
(1)强引用:指在程序代码中国普遍存在的,类似于“Object object=new Object()”这类的引用,只要强引用还存在,GC就永远不会回收掉被引用的对象;
(2)软引用:用来描述一些有用但是非必须的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行第二次回收。如果这次回收还没有足够的内存,才会跑出内存溢出异常,在JDK1.2后有SoftReference 实现软引用。
(3)弱引用:用来描述非必须对象,但是其强度比软引用更弱一些,被弱引用关联的对象只能生存岛下一次垃圾收集发生之前。当GC工作时,无论当前内存是否足够,都会回收掉只被软引用关联的对象。JDK1.2之后提供了WeakReference类来实现弱引用。
(4)虚引用:也称幽灵引用或者幻影引用,他是最弱的一种引用关系。一个对象是否有虚引用的存在我拿全部会对其生存时间构成影响,也无法通过虚引用来取得一个度喜爱你那个的实例。兑一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。 在JDK1.2后提供了PhantomReference 类来实现虚引用。
相关文章推荐
- 垃圾收集器-GC以及判断对象存活的算法以及引用类型
- java中对象的引用类型及判断对象是否存活的算法
- 深入理解JVM03--判断对象是否存活(引用计数算法、可达性分析算法,最终判定),Eclipse设置GC日志输出,引用
- 深入理解JVM--第三章--判断对象是否存活(引用计数算法、可达性分析算法,最终判定)
- javaVM 判断对象实例何时回收 用的可达性分析算法,而非引用计数算法
- Java对象是否存活之引用计数算法&可达性分析算法
- Java中判断对象是否存活算法之可达性分析算法
- java对象几种引用(reference)的分析
- java--封装一类Java对象,用户从输入对话框输入两个日期,程序将判断两个日期的大小关系(比如输出:您输入的第二个日期大于第一个日期)以及两个日期之间的间隔天数(比如输出:2006年6月6日和
- Java对象的生命周期与垃圾回收以及四种引用
- JAVA 对象引用,以及对象赋值
- JAVA 对象引用,以及对象赋值
- JAVA 对象引用,以及对象赋值-深刻理解A a1 = new A()这句话
- JAVA 对象引用,以及对象赋值
- 经典图算法Java代码实践:BFS,DFS以及几种最短路径算法
- 深入理解Java虚拟机笔记---判断对象是否存活
- 浅谈一下JAVA对象,对象引用以及对象赋值
- JVM判断对象存活的算法
- java 中对象引用,以及对象赋值
- JVM概念中的Java对象的大小,以及三种引用类型的定义与区分