自动内存管理机制

一、引用计数法

给对象添加一个引用计数器,每一个地方引用它,计数器值就+1;当引用失效时,计数器的值就-1;任何时刻计数器为0的时候都是不能使用的。
这种gc算法比较难解决循环引用的问题。

二、根搜索算法

通过一系列名为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径成为引用链,当一个对象到GC Roots没有任何引用链相连(用图论的话说就是从GC Roots到这个对象不可达)时,则证明这个对象是不可用的。

虚拟机栈(栈帧中的本地变量表)中的引用对象
方法区中的类静态属性引用的对象
方法区中的常量引用对象
本地方法区中jni(native)的引用的对象

三、引用

在jdk1.2之前,java中引用的定义很传统:如果reference类型的数据中存储的数值代表的是另一块内存的起始地址,就称这块内存代表着一个引用。
在jdk1.2之后,java对引用进行扩充,强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(phantom Reference)四种,这四种强度依次递减

强引用就是指在程序代码中普遍存在的,类似“Object obj=new Object”这类的引用,只要强引用还存在,垃圾收集器就永远不会收掉这个对象
软引用用来描述一些还有用,但并非必须的对象。对于软引用关联的对象,在系统要发生oom之前将把这些对象列进回收范围进行二次回收。
弱引用用来描述非必须对象的,被弱引用关联的对象只能存活到下一次垃圾收集之前。
一个对象是否被虚引用引用,完全不会对其生存时间造成影响,也无法通过引用获得实例。

四、根搜索算法不可达情况

根搜索算法不可达并不是立即清除对象,至少需要经历两次标记过程,如果不可达须经过两次筛选,第一次筛选该对象是否有必要执行finalize()方法,当对象没有覆盖finalize方法或者finalize方法已经被虚拟机调用过,那就是被有必要执行。

五、回收方法区

方法区或者说永久代(hotspot)垃圾手机主要回收两部分内容:废弃常量和无用的类

该类的实例都被回收了
加载该类的classLoader也被回收了
该类对应的java.lang.Class没有被任何地方引用,无法在任何地方通过反射访问该类的方法
类卸载功能开启-Xnoclassgc

你可能感兴趣的:(深入理解java虚拟机,java)