JVM (5) --- 가비지 컬렉션 (가비지 컬렉션 알고리즘 및 콜렉터)

1. 가비지 컬렉션 알고리즘

1.1 마크 - 스윕 알고리즘

알고리즘은 "표시"와 "명확한"단계로 나누어 져 있습니다 : 첫째 모든 객체를 복구 할 필요가 라벨이 완료된 후, 모든 통합 오브젝트가 복구를 표시됩니다 표시합니다. 그것은 효율이 매우 높은,하지만이 개 명백한 질문을 가져올 것이다, 가장 기본적인 수집 알고리즘입니다 :

1. 효율성

2. 공간 문제는, 태그를 제거 개별 조각을 많이 생성합니다

 

1.2 복제 알고리즘

효율성 문제를 해결하기 위해, "복사"수집 알고리즘 나타났다. 이는 사용되는 각 중 하나에 두 개의 동일한 크기의 메모리 일 수있다. 메모리 사용량이 한 후, 그것은 또한 공간에 또 다른 조각에 복사 한 후 한 번에 사용하는 오브젝트를 사는 다음 청소 때. 이것은 각 복구 메모리가 재활용 절반 간격의 메모리입니다 수 있습니다.

 

1.3 마크 - 정렬 알고리즘

나이가있는 마커 알고리즘의 뛰어난 특성에 따르면, 과정을 표시하는 것은 여전히있는 "마크 - 청소"와 같은 알고리즘하지만, 재활용 객체의 복구를 위해 직접적으로 다음 단계, 그러나 기간쪽으로 이동하고, 모든 생존 개체에 직접 정리 마지막 오프의 경계를 넘어 메모리.

 

1.4 세대 컬렉션 알고리즘

현재 가비지 컬렉션 가상 머신은 다른 개체에 기초한 세대 컬렉션 알고리즘은 몇 개로 메모리 기간 살아남을 구현한다. 일반적으로 새로운 세대에 자바 힙 및 이전 시대, 그래서 우리는 각 시대의 특성에 따라 적절한 가비지 컬렉션 알고리즘을 선택할 수 있습니다.

예를 들어, 새로운 세대에 각 컬렉션 죽을 많은 수의 개체를해야합니다, 그래서 당신은 알고리즘을 복사 할 수 있습니다, 각 가비지 수집을 완료하는 개체의 적은 수의 재생의 비용을 지불해야합니다. 생존의 세 대상의 기회가 상대적으로 높고, 그 보증에 할당 된 여분의 공간이 없다, 그래서 우리는 선택해야합니다 "마크 - 스윕"또는 "마크 - 마무리"가비지 수집 알고리즘을.

2. 가비지 수집기

복구 알고리즘 방법은, 콜렉터는 구체적인 구현

2.1 직렬 수집기

 Serial(串行)收集器收集器是最基本、历史最悠久的垃圾收集器了。大家看名字就知道这个收集器是一个单线程收集器了。它的 “单线程” 的意义不仅仅意味着它只会使用一条垃圾收集线程去完成垃圾收集工作,更重要的是它在进行垃圾收集工作的时候必须暂停其他所有的工作线程( "Stop The World" ),直到它收集结束。新生代采用复制算法,老年代采用标记-整理算法。但是它简单而高效(与其他收集器的单线程相比)。Serial收集器由于没有线程交互的开销,自然可以获得很高的单线程收集效率。

----------

2.2 ParNew收集器

ParNew收集器其实就是Serial收集器的多线程版本。

----------

2.3 Parallel Scavenge收集器(1.8默认收集器)

Parallel Scavenge 收集器类似于ParNew 收集器,是Server 模式(内存大于2G,2个cpu)下的默认收集器

Parallel Scavenge收集器关注点是吞吐量(高效率的利用CPU)。CMS等垃圾收集器的关注点更多的是用户线程的停顿时间(提高用户体验)。所谓吞吐量就是CPU中用于运行用户代码的时间与CPU总消耗时间的比值。 Parallel Scavenge收集器提供了很多参数供用户找到最合适的停顿时间或最大吞吐量。

新生代采用复制算法,老年代采用标记-整理算法。

----------

2.4.Serial Old收集器

Serial收集器的老年代版本,它同样是一个单线程收集器。

----------

2.5 Parallel Old收集器

Parallel Scavenge收集器的老年代版本。使用多线程和“标记-整理”算法。在注重吞吐量以及CPU资源的场合,都可以优先考虑 Parallel Scavenge收集器和Parallel Old收集器。

----------

 

2.6 CMS收集器(主要是old区使用)

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。它而非常符合在注重用户体验的应用上使用,它是HotSpot虚拟机第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程(基本上)同时工作。

从名字中的Mark Sweep这两个词可以看出,CMS收集器是一种 标记-清除”算法实现的,它的运作过程相比于前面几种垃圾收集器来说更加复杂一些。整个过程分为四个步骤:

1.初始标记: 暂停所有的其他线程(STW),并记录下直接与GC Roots相连的对象,速度很快 ;

2.并发标记: 同时开启GC和用户线程,去记录可达对象。但在这个阶段结束,并不能保证包含当前所有的可达对象。因为用户线程可能会不断的更新引用域,所以GC线程无法保证可达性分析的实时性。所以这个算法里会跟踪记录这些发生引用更新的地方。

3.重新标记: 重新标记阶段就是为了修正并发标记期间因为用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段的时间稍长,远远比并发标记阶段时间短

4.并发清除: 开启用户线程,同时GC线程开始对未标记的区域做清扫。

 

主要优点:并发收集、低停顿。但是它有下面三个明显的缺点:

1对CPU资源敏感(会和服务抢资源);

2.无法处理浮动垃圾(在java业务程序线程与垃圾收集线程并发执行过程中又产生的垃圾,这种浮动垃圾只能等到下一次gc再清理了);

3.它使用的回收算法-“标记-清除”算法会导致收集结束时会有大量空间碎片产生。

CMS的相关参数

  1. -XX:+UseConcMarkSweepGC 启用cms 
  2. -XX:ConcGCThreads:并发的GC线程数(并非STW时间,而是和应用线程一起执行的线程数)
  3. -XX:+UseCMSCompactAtFullCollection:FullGC之后做压缩(减少碎片)
  4. -XX:CMSFullGCsBeforeCompaction:多少次FullGC之后压缩一次(因压缩非常的消耗时间,所以不能每次FullGC都做)
  5. -XX:CMSInitiatingOccupancyFraction:触发FulGC条件(默认是92)
  6. -XX:+UseCMSInitiatingOccupancyOnly:是否动态调节
  7. -XX:+CMSScavengeBeforeRemark:FullGC之前先做YGC(一般这个参数是打开的)

2.7 G1收集器(1.9 默认收集器)

G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征.

G1对堆的划分有所不同,它将Java堆划分为多个大小相等的独立区域(Region),虽保留新生代和老年代的概念,但不再是物理隔阂了,它们都是(可以不连续)Region的集合。

分配大对象(直接进Humongous区,专门存放短期巨型对象,不用直接进老年代,避免Full GC的大量开销)不会因为无法找到连续空间而提前触发下一次GC。

 

G1特点

1.并行与并发:G1能充分利用CPU、多核环境下的硬件优势,使用多个CPU(CPU或者CPU核心)来缩短Stop-The-World停顿时间。部分其他收集器原本需要停顿Java线程来执行GC动作,G1收集器仍然可以通过并发的方式让java程序继续执行。

2.分代收集:虽然G1可以不需要其他收集器配合就能独立管理整个GC堆,但是还是保留了分代的概念。

3.空间整合:与CMS的“标记--清理”算法不同,G1从整体来看是基于“标记整理”算法实现的收集器;从局部上来看是基于“复制”算法实现的。

4.可预测的停顿:这是G1相对于CMS的另一个大优势,降低停顿时间是G1 和 CMS 共同的关注点,但G1 除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段内完成垃圾收集。

G1收集器的运作大致分为以下几个步骤:

1.初始标记(initial mark,STW):在此阶段,G1 GC 对根进行标记。该阶段与常规的 (STW) 年轻代垃圾回收密切相关。

2.并发标记(Concurrent Marking):G1 GC 在整个堆中查找可访问的(存活的)对象。

3.最终标记(Remark,STW):该阶段是 STW 回收,帮助完成标记周期。

4.筛选回收(Cleanup,STW):筛选回收阶段首先对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间来制定回收计划,这个阶段其实也可以做到与用户程序一起并发执行,但是因为只回收一部分Region,时间是用户可控制的,而且停顿用户线程将大幅提高收集效率。

 

G1收集器在后台维护了一个优先列表,每次根据允许的收集时间,优先选择回收价值最大的Region(这也就是它的名字Garbage-First的由来)。这种使用Region划分内存空间以及有优先级的区域回收方式,保证了G1收集器在有限时间内可以尽可能高的收集效率。

 

추천

출처www.cnblogs.com/nijunyang/p/11109516.html