判断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 类来实现虚引用。