[Java虚拟机读书笔记]3章 垃圾收集器与内存分配策略

来源:互联网 发布:php htmlspecialchars 编辑:程序博客网 时间:2024/06/05 07:44

一.判断对象是否存活

1.引用计数算法:给对象中添加一个引用计数器,每当一个地方引用它时,计数器值就加1;当引用失效时,计数器值就      减1;任何时刻计数器为0的对象就是不可能再使用

2.可达性分析算法(java中使用):通过一系列的称为"GCRoots"的对象作为起始点,从这些节点开始向下搜索,搜索所    走过的路径称为引用链,当一个对象到CG Roots没有任何引用链相连时,则证明次对象是不可用的.


二.垃圾回收算法

1.标记-清除算法:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象

                             优点:实现简单

     缺点:标记和清除两个过程效率不高;标记清除后会产生大量不连续的碎片

2.复制算法:将可用内存按容量划分为对应比例的两块,每次只使用一块,当这一块内存用完后,就将存活着的对象复制到另一块上面,然后再把已经使用过的内存空间一次清理掉,不用考                     虑碎片问题

                    优点:内存分配时不用考虑内存碎片问题等复杂去年概况,只需要移动堆顶指针,按顺序分配内存即可,运行高效

                    缺点:内存缩小

3.标记-整理算法:标记过程同"标记-清除算法"相同,但后续步骤不是直接对可回收对象进行清除,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存


4.分代收集算法:根据对象存活的周期不同划分为几块,一般分为新生代和老年代这样根据各个年代的特点采用适当的收集算法,如新生代用复制算法,老年代用标记法


三.各收集器

 名称                       线程                     运行代区                   使用算法           注解

Serial                    单线程                      新生代                        复制

Serial Old             单线程                      老年代      标记整理

ParNew              多线程并行                 新生代                        复制            缩短停顿时间

ParNew Old       多线程并行                 老年代                    标记整理         

Parallel S           多线程并行                 新生代                        复制                吞吐量

CMS                       并发                         老年代                    标记清除        缩短停顿时间


四.内存分配与回收策略

1.对象优先在 新生代Eden区中分配,当新生代没有足够的空间进行分配时,虚拟机发起一次Minor GC;

2.大对象直接进入老年代;

3.长期存活的对象进入老年代(给每个对象定义了一个对象年龄计数器,如果在Eden出生并经过第一次Minor GC后仍然存活,并且能被Survivor容纳的话,将被移至Survivor空间中,并且对象年龄设为1;对象在Survivor每熬过一次Minor GC,年龄+1,当它的年龄增加到一定程度进入老年代)

4.动态对象年龄判定:如果Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半年龄大于或等于该年龄的对象就可以直接进入老年代


0 0
原创粉丝点击