JVM GC 相关内容(待续)

来源:互联网 发布:绝爱后宫我知帝王心txt 编辑:程序博客网 时间:2024/05/02 04:23

    • 如何判断一个对象是否存活
    • 垃圾收集算法
    • 垃圾收集器

如何判断一个对象是否存活

1、 引用计数:

2、可达性分析算法

垃圾收集算法

1、标记—清除:

算法分为“标记”和“清除” 两个阶段;首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。之所以说它是最基础的收集算法,是因为后续的收集算法都是基于这种思路并对其缺点进行改进而得到的。

它的主要缺点有两个:一个是效率问题,标记和清除过程的效率都不高;另外一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致,当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。

2、复制算法:

“复制”(Copying)的收集算法,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
这样使得每次都是对其中的一块进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可,实现简单,运行高效。只是这种算法的代价是将内存缩小为原来的一半,持续复制长生存期的对象则导致效率降低。

3、标记—压缩算法

复制收集算法在对象存活率较高时就要执行较多的复制操作,效率将会变低。更关键的是,如果不想浪费50%的空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都100%存活的极端情况,所以在老年代一般不能直接选用这种算法。

根据老年代的特点,有人提出了另外一种“标记-整理”(Mark-Compact)算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存

4、分代收集算法

绝大部分对象的生命周期都非常短暂,存活时间短。

“分代收集”(Generational Collection)算法,把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”或“标记-整理”算法来进行回收。

垃圾收集器

这里写图片描述

1、Serial 收集器

最基本、发展历史最悠久的收集器,JDK 1.3.1 之前 是虚拟机新生代收集器的唯一选择。
是单线程的收集器,但它的“单线程”的意义并不仅仅是说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。
这里写图片描述

2、ParNew 收集器

其实就是Serial 收集器的多线程版本。
ParNew是许多运行在Server模式下的虚拟机中首选的新生代收集器,在JDK1.6以及之前的版本中,除了Serial收集器外,只有它能与CMS收集器配合工作。
在JDK 1.5时期,HotSpot推出了一款在强交互应用中几乎可称为有划时代意义的垃圾收集器—CMS收集器(Concurrent Mark Sweep,本节稍后将详细介绍这款收集器),这款收集器是HotSpot虚拟机中第一款真正意义上的并发(Concurrent)收集器,它第一次实现了让垃圾收集线程与用户线程(基本上)同时工作,用前面那个例子的话来说,就是做到了在你妈妈打扫房间的时候你还能同时往地上扔纸屑。
所以在JDK 1.5中使用CMS来收集老年代的时候,新生代只能选择ParNew或Serial收集器中的一个。ParNew收集器也
这里写图片描述
3、Pararllel Scavenge 收集器
是一个新生代收集器。它也是使用复制算法的收集器,又是并行的多线程收集器。
目标是达到一个可控制的吞吐量(ps: CPU用于运行用户代码的时间与CPU总消耗时间的比值,即 吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间))。
提供两个参数用于精确控制吞吐量:
控制最大垃圾收集停顿时间 -XX:MaxGCPauseMills
设置吞吐量大小 -XX:GCTimeRation

4、Serial Old 收集器

5、Parallel Old 收集器

6、CMS 收集器

一种以获取最短回收停顿时间为目标的收集器。
基于“标记——清除”算法实现的 分4个步骤
1、初始标记
2、并发标记
3、重新标记
4、并发清除

7、G1 收集器

并行与并发
分代收集
空间整合
可预测的停顿
不计算维护Remembered Set操作可以分步骤
初始标记
并发标记
最终标记
筛选回收