《深入理解java虚拟机》读书笔记四 【垃圾收集算法和垃圾收集器】

来源:互联网 发布:整型数据占几个字节 编辑:程序博客网 时间:2024/06/07 11:54

垃圾收集算法

1.标记-清除算法Mark-Sweep

缺点:效率低;有内存碎片。

2.复制算法Copying

将可用内存按容量划分为大小相等的两块,每次只使用其中的一块,当这一块的内存用完了,就将还存活着的对象复制到另一块上面,然后再把已经使用的内存空间一起清理掉。

缺点:内存缩小为原来的一半,对象存活率高时复制操作多

优点:没有内存碎片,实现简单,运行高效

3.标记-整理算法Mark-Compact

让所有存活对象移动到一端,然后直接清理掉端边界以外的内存。

4.分代收集算法Generational Collection

根据对象存活周期不同,将内存划分为新生代和老年代,新生代采用复制算法,老年代采用标记-清理或标记-整理算法。

新生代包含:Eden区和两个Suivivor区(from和to),一般-XX:SuivivorRatio=8

对象优先分配在Eden区和From区,大对象根据 -XX:PretenureSizeThreshold=3145728设置分配到老年代。

一次MinorGC做的事情:

1.回收Eden区和From区对象

2.将Eden区和From区存活对象复制到To区

2.1成功,年龄+1

2.1.1年龄超过阈值MaxTenuringThresold,复制到老年代

2.2失败,分配担保到老年代

3.清空Eden区和From区

4.From区变To区,To区变From区,变化角色后的From区有上次GC留下的对象,To区为空


垃圾收集器

1.Serial-serial old

单线程,stop the world,简单高效

2.ParNew-Serial old

新生代多线程,老年代单线程

3.Parallel Scavenge-Parallel old

多线程,吞吐量优先,GC停顿时间缩短是以牺牲吞吐量和新生代空间换取的。

4.Serial-CMS

新生代serial,老年代CMS

Concurrent Mark Sweep,并发标记清除,多应用在BS服务端,以获取最短回收停顿时间为目标。四个过程:

  初始标记:stop the world,单线程

并发标记:

重新标记:stop the world,并行

并发清除:

缺点:

1.对CPU资源敏感

2.无法处理浮动垃圾

3.大量空间碎片

5.Parnew-CMS

新生代Parnew,老年代CMS

6.G1

基于标记-整理算法,实时垃圾收集器,优先回收垃圾最多的区域。可以实现基本不牺牲吞吐量的前提下完成低停顿的内存回收。




阅读全文
0 0
原创粉丝点击