引用计数算法:给对象中添加一个引用计数器,每当有引用它时,计数器值就加1;当引用失效时,计数器值就减1;任什么时候刻计数器为0的对象就是不可能再被使用。算法
Java虚拟机里面没有选用引用计数算法来管理内存,其中主要缘由是他很难解决对象之间相互引用的问题。spa
例如:对象objA和objB都有字段instance字段,且互相赋值,但实际上这两个对象已经不可线程
能被访问了,但由于他们互相引用着对方,致使他们的引用计数都不为0,因而致使他们没法回收。code
(Java中这种状况是能够回收的)对象
public class ReferenceGC { public Object instance = null; public static void testGC(){ ReferenceGC objA = new ReferenceGC(); ReferenceGC objB = new ReferenceGC(); objA.instance = objB; objB.instance = objA; objA = null; objB = null; } }
可达性分析算法:经过一系列的称为"GC Root"的对象做为起点,从这些节点开始向下搜索,blog
搜素所走过的路径称为引用链(Reference Chain),当一个对象到GC Root没有任何的引用链队列
相连,就断定对象能够被回收。Java, C#等语言都是使用这种算法判读对象的存活的。内存
GC Root的对象包括下面几种:字符串
虚拟机栈(栈帧中的本地变量表)中引用的对象虚拟机
方法区中类静态属性引用的对象
方法区中常量引用的对象
本地方法栈中JNI(Native方法)引用的变量
Java1.2后对引用进行扩充,分为:
强引用:相似 Object obj = new Object()这类引用,垃圾收集器永远不会进行回收
软引用:用来描述一些还有用但非必须的对象。系统在内存溢出异常以前,将会把这些
对象列入回收范围之中进行。二次回收。若是此次回收尚未足够的内存,才会抛出内存异常。
SoftReference类实现。
弱引用:比软引用更弱一些,也是用来描述非必须对象。回收发生在下次垃圾收集器回收时。
WeakReference类实现。
虚引用:最弱一种引用,虚引用没法影响对象其生存时间,也没法经过虚引用得到
对象,惟一目的就是对象被垃圾收集器回收时,收到一个系统通知。PhantomReference类实现。
若是对象在进行可达性分析后发现没有与GC Roots相连的引用链,那么它将会被第一次标记而且进行
一次筛选,筛选条件是该对象是否覆盖finalize()方法,是否执行过finalize()方法。若是为覆盖或执行过则
对象死亡。
若是覆盖finalize()且有必要执行finalize(),则对象放入F-Queue的队列中,以后由虚拟机自动创建,
低优先级的Finalizer线程去执行。这里的执行是指虚拟机会触发这个方法,但不承诺会等待它运行结束。
(该方法不建议使用)
方法区主要回收:废弃常量和无用的类
废弃常量:例如一个字符串"abc"已经进入常量池中,可是当前系统没有其余地方引用这个字面量。
无用的类:
该类的全部实例都已经被回收,也就是Java堆中不存在该类的任何实例
加载该类的ClassLoader已经被回收
该类对应的Java.lang.Class对象没有在任何地方被引用,没法再任何地方经过反射访问该类的
方法。
标记-清除算法:首先标记出全部须要回收的对象,在标记完成后统一回收全部标记的对象,标记过
程在上面提过。
不足:1.效率问题,标记和清除两个过程效率不高
2.空间问题,标记清楚产生大量内存碎片
复制算法:将内存安装容量分为大小相等的两块,每次使用其中一块。当回收时,将存活的对象复制到
为使用的内存中,清楚已使用过的内存。
不足:内存缩小到运来的一半
Java在新生代中采用这种算法,不过是将内存分为Eden和两块Survivor,每次使用Eden和其中的Suvivor
当回收时,将Eden和Suvivor存活的内存复制到未使用的Suvivor空间。HotSpot默认Eden与Suvivor比例为
8:1,至关于可使用90%的内存,若是存活的内存超过Suvivor空间,就是用老年代进行分配担保。
标记-整理算法:过程与标记-清除算法同样,但后续步骤不是直接对可回收对象进行清理,而是让全部存活
的对象向一端移动,而后清理掉端边界之外的内存。
分代收集算法:将内存划分红几块,各个区域采用最适当的收集算法。Java通常把Java堆分为新生代和老年代,
按各个年代特色采用适当的算法。
垃圾收集器:
新生代:Serial收集器,ParNew收集器,Parallel Scavenge收集器
老年代:CMS, Seral Old(MSC), Parallel Old收集器
GI收集器