目录
1、如何判断“已死”:
1.1 引用计数法:
1.2 可达性分析算法
1、如何判断“已死”:
1.1 引用计数法:
引用计数法描述的算法为:给对象增加一个引用计数器,每当有一个地方引用时,计数器就+1;当引用失效时,计数器-1;当计数器为0时,说明无对象引用,也就说明对象"已死"
主流的jvm中没有选用引用计数法管理内存,主要原因是引用计数法无法解决循环依赖问题;
1.2 可达性分析算法
核心思想:
通过一系列称为:"GC Roots"的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径成为“引用链”,当一个对象到GC Roots没有任何的引用链相连时(从 GC Roots 到这个对象不可达)时,证明此对象不可用。
作为GC Root对象的包括:
1、虚拟机栈(栈帧中的本地变量表)中引用
的对象
2、方法区中静态属性引用的对象
3、方法区中常量引用的对象
4、本地方法栈中(native方法)引用的对象
引用状态:
在JDK1.2以前,Java中引用的定义只有被引用,未被引用两种状态。
在JDK1.2以后,java对引用的概念做了扩充,将引用分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)四种,这四种引用的强度一次递减。
1、强引用:强引用指的是在程序代码中的,类似于“Object a = new Object”,只要强引用还存在,垃圾回收器永远不回收被引用的对象实例
2、软引用:软引用时用来描述一些还有用但是不是必须的对象。对于软引用关联着的对象,在系统将要发生内存溢出之前,会把这些对象列入回收范围之中进行第二次回收。如果这次回收还是没有足够的内存,才会抛出内存溢出异常。在JDK1.2之后,提供了SoftReference类来实现软引用
3、弱引用:弱引用也是用来描述非必需对象的。但是它的强度要弱于软引用。被弱引用关联的对象只能生存到下一次垃圾回收发生之前。当垃圾回收期开始进行工作时,无论当前内容是否够用,都会回收掉只被弱引用关联的对象,在JDK1.2之后,提供了WeakReference类来实现弱引用
4、虚引用:虚引用也被称为幽灵引用或者幻影引用,最弱的一种引用关系。一个对象能否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。在JDK1.2之后,提供了PhantomReference类来实现虚引用。



