第一阶段:串行垃圾回收器:jdk1.3.1之前Java虚拟机仅仅只支持Serial收集器
第二阶段:并行垃圾回收器:随着多核的出现,Java引入了并行垃圾回收器,充分利用多核性能提升垃圾回收效率
第三阶段:并发标记清理回收器CMS:垃圾回收器可以和应用程序同时运行,降低暂停用户线程执行的时间
第四阶段:G1(并发)回收器:初衷是在清理非常大的堆空间的时候能满足特定的暂停应用程序的时间,与CMS相比会有更少的内存碎片
垃圾回收器(GC:Garbage Collection)的3个任务:分配内存、确保被引用对象不被错误回收、回收不再被引用的对象的内存空间
单线程垃圾回收器,运行时会暂停所有应用线程,Stop The World(STW),不适用与服务器环境中,适用在客户端程序中;
可以使用JVM参数-XX:+UseSerialGC来指定使用串行垃圾回收器
年轻代使用的是拷贝算法,老年代或永久代使用的是标记-清扫-压缩算法
标记-清扫-压缩:标记阶段识别哪些对象存活;扫描阶段会扫描整个代,识别出哪些是垃圾;压缩阶段执行平移压缩,存活的移动到最前端,尾部流出连续空闲空间。
之后的分配就可以在老年代或永久代使用空指针算法
空指针(bump-the-pointer)算法:JVM维护2个指针(allocatedTail指向已分配对象的尾部,geneTail指向代尾)当需要分配内存是由两个指针可判断剩余空闲空间是否够用,如果够则更新allocatedTail指针来把内存分配给请求的对象
并行垃圾回收运行时仍然会暂停应用程序,但使用了多线程能够缩短垃圾回收的时间
设置使用的垃圾回收算法:-XX:+UseParallelGC 在单核CPU上设置无效
在一台有N个CPU的主机上并行垃圾回收器会使用N个垃圾回收线程进行垃圾回收,也可通过参数指定:-XX:ParalleGCThreads=<垃圾回收器线程个数>
最大并发量的标记清除垃圾回收器:Concurrent Mark Sweep;年轻代使用拷贝算法,老年代使用最大并发量的标记清除算法(避免清理老年代暂停用户程序太长时间)
主要通过以下两种方法来实现避免用户程序有太长时间的停顿:
这种算法花费了大量的时间在标记-清理阶段,这个阶段的认为可与用户线程并发执行,不过仍与用户线程竞争CPU资源,默认下该GC算法使用的线程数等于机器物理内核数量的1/4
可使用参数:-XX:UseConcMarkSweepGC显示指定使用CMS算法。
CMS的执行步骤:
这种回收算法与应用程序的并发执行大大减少了暂停应用程序的时间,适用于在多核机器上使用,与并行垃圾回收器相比CMS通常在CPU密集的应用程序中有更低的吞吐量。
G1(Garbage-First)解决了垃圾回收器暂停用户线程时间的不确定性,它是面向服务器的垃圾回收器,主要针对配备多核CPU及大容量内存的机器,在以极高的概率满足GC暂停用户线程的同时还具有很高的吞吐量,主要有以下几个特点:
与之前的垃圾回收器相比,G1可被看作是一种增量式的并行压缩GC算法,它提供了可以预测暂停时间的功能。通过并行、并发和多阶段标记循环,G1可被应用在堆空间更大的场景,同时还提供合理的在最坏情况下的暂停时间。它的基本思想是在GC工作前设置堆范围(-Xms用来设置堆的最小值,-Xmx设置堆的最大值)和实际暂停目标时间(使用-XX:MaxGCPauseMillis来设置)
G1将年轻代、老年代的物理空间划分取消了,它将堆空间划分为若干个区域Region,一段连续的堆空间被划分为固定大小的区域,然后用一个空闲链表来维护,每个区域要么对应老年代,要么对应年轻代,根据实际堆空间的大小这些区域可被划分为1MB~32MB,从而可以保持总的区域个数在2048左右。G1最主要的原则是:在标记阶段完成后,G1就可以知道哪些heap区的empty空间最大,它会在满足暂停时间的基础上优先回收空闲区域最大的区域,因此它也被称为garbage-first(垃圾优先)的垃圾回收器
虽然引入了区域的概念,但G1本质上仍然属于分代回收器,年轻代的垃圾回收依然会暂停应用线程的执行,它会把存活对象拷贝到Survivor或者老年代;在老年代中G1通过把对象从一个区域复制到另外一个区域来实现垃圾清理的工作,好处是压缩了堆内存,避免了CMS的那种内存碎片的问题,而在G1中这些区域可以是不连续的;
除了年轻代的Eden区、Survivor区和老年代的Old,G1还引入了一种特殊的区域:Humongous区域;这些区域被设计为存放占用超过分区容量50%以上的那些对象,它们被保存在一个连续的区域集合里;对于很大的对象默认会被分配到老年代,如果该对象的生命周期较短则会对垃圾回收器的性能造成很大的影响,Humongous区域就是为了解决这个问题,如果一个H区无法容纳那么G1会寻找连续的H区来存储;
在老年代的回收算法主要分为以下几个步骤:
原文:https://www.cnblogs.com/z-dk/p/14728499.html