垃圾收集器和内存分配策略
本书是基于jdk1.7所写
1引用计数算法:算法简单,原理:给对象添加一个引用计数器,每当有一个地方引用了他,计数器就加一,当引用失效就减一,计数器为0就是不可能再被使用的。缺点:无法解决对象之间相互循环引用的问题
2 可达性分析算法 :以“GC Root”为起始点,向下搜索,搜索所走过的路径称为引用链,当一个对象到起始点没有任何引用链相连接,证明此对象是不可用的
2.1对象的自我救赎
一个对象的死亡要经历至少两次标记过程,第一次被标记以后,该对象会被放置到一个F-Queue的队列中,如何在队列期间,该对象再次被引用了,那么就不会死亡。
3标记清除算法:首先标记出所有需要回收的对象,标记完成以后统一回收。缺点:效率不高,容易产生内存碎片。
4复制算法:将内存划为两块,每次只使用其中的一块,当其中一块内存用完了,就将存活的对象复制到另外一块上面去,然后把已使用的的内存空间一次清理掉。优点:效率较高,没有内存碎片
5标记整理算法:过程于标记清除算法一样,但后续步骤是让所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存。不会产生内存碎片。
垃圾收集器:
serial收集器:单线程的特点,在收集垃圾时会停止其他一切工作的线程。
ParNew收集器:serial收集器的多线程版本。
Parallel Scavenge收集器:设计目的是达到一个可控制的吞吐量。吞吐量 = 运行用户代码时间/(运行用户代码时间+垃圾收集时间)
CMS收集器:是一种获取最短回收停顿时间为目标的收集器。过程分为四个步骤:初始标记,并发标记,重新标记,并发清除
缺点:对cpu资源非常敏感,无法收集浮动垃圾,有内存碎片。
G1收集器:特点:并行也并发,分代收集,空间整合,可预测的停顿。设计思路:将整个java堆划分为多个大小相等的独立区域,每次回收回收价值大的区域。