jvm垃圾收集器

 

1、Serial垃圾收集器:

         Serial是一个单线程的垃圾收集器。

         Stop The World,进行垃圾收集时,必须暂停其他所有工作的线程,直到他收集结束,在用户不可见的情况下把用户正常的工作线程全部停掉。效率低。

        使用场景:多用于桌面应用。

       桌面应用内存小,进行垃圾回收时间短,只要不频繁停顿就可以接受。

2、Parrell New垃圾收集器:

    用来回收新生代。

      ParNew收集器其实就是Serial的多线程版本,除了使用多线程进行垃圾收集之外,其他行为包括Serial收集器可用的搜友控制参数(-XX:SurvivorRatio、XX:PretenureSize Threshold、-XX:HandlePromotionFailure等)、收集算法、Stop The Word、对象分配规则、回收策略等都与Serial收集器完全一样,在实现上,这两种收集器也共用了相当多的代码。

     特点:ParNew收集器除了多线程收集之外,其他与Serial收集器并没有太多创新之处,但他却是很多运行在Server模式下的虚拟机中首选的新生代收集器,其中有一个与性能无关但很重要的原因是,除了Serial收集器外,目前只有他能与CMS收集器配合工作。

     多线程操作上下文切换问题,所以建议将-XX:ParalelGCThreads设置成和CPU核数相同,如果设置太多的话,就会产生上下文切换消耗。

     并行与并发:

         并行(Paralle):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。

        并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行于另一个CPU上。

3、CMS垃圾回收器:

       用来回收老年代。

      CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。

      目前很大一部分的Java应用集中在互联网网站或者B/S系统的服务端上,这类应用尤其重视服务的相应速度,希望的停顿时间最短,以给用户良好的体验。

     CMS是基于“标记--清除”实现的。

     步骤流程:

        (1)初始标记(CMS initial mark)-----标记一下GC Roots 能直接关联到的对象,速度很快。

        (2)并发标号(CMS concurrent mark)------并发标记的阶段就是进行GC RootsTracing的过程。

       (3)重新标记(CMS remark)-----为了修正并发标记期间因用户程序导致编辑变动的标记记录。

       (4)并发清除(CMS concurrent sweep)

    GMS垃圾收集器的缺点:对CPU资源非常敏感、无法处理浮动垃圾、标记----清除暂时空间碎片。

4、Parallel Scavenge收集器:

      为新生代收集器,他也是使用复制算法的收集器,又是并行的多线程收集器。

      由于与吞吐量关系密切,Parallel Scavenge收集器也经常被称为“吞吐量优先”收集器。

    特点:

        (1)Parallel Scavengle 收集器的特点是他的关注点与其他收集器不同,CMS等收集器的关注点是尽可能的缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge收集器的目标则是达到可控的吞吐(Throughput)。所谓吞吐量就是CPU用于运行用户运行用户代码的时间与CPU总消耗时间的比值,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间),虚拟机总共运行了100分钟,其中垃圾收集花了1分钟,那么吞吐量就是99%,停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能提升用户体验,而高吞吐量则可以高效的利用CPU时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。

         (2)虚拟机会根据当前系统的运行情况收集性能监控等信息,动态调整这些参数已提供最适合的停顿时间或者最大的吞吐量,这种调节方式称为GC自适应调节策略。

5、G1垃圾收集器:

      G1是一款面向服务器端应用的垃圾收集器。

      特点:

              G1中每个Region都有一个与之对应的Remembered Set,当进行内存回收时,在GC根节点的枚举范围中中加入Remembered Set即可保证不会对全堆扫描也不会有遗漏。

   G1收集器运作步骤:

      初始标记(initial Marking)-----标记一下GC Roots能直接关联到的对象。

     并发标记(Councurrent Marking)-----从GC Root开始对堆中的对象进行可达性分析,找出存活的对象这阶段耗时较长,但可以与用户并发执行。

    最终标记(Final Marking)-----为了修正在并发标记期间因用户程序继续运作而导致的标记产生变动的那一部分标记记录,虚拟机将这段时间对象变化记录在线程Remembered Set Logs中,最终标记阶段需要把Remembered Set Logs的数据合并到Remember Set中,

   筛选回收(Live Data Counting and Evacuation)

  G1的优势:

       (1)空间整合:基于标记整理算法实现为主,Region之间采用复制算法实现垃圾收集。

       (2)可预测的停顿:这是G1相对于CMS的另一大优势,降低停顿时间是G1和CMS共同的关注点,但是G1除了追求低停顿外,还能建立可预测的停顿时间模型。

       (3)在G1之前的其他收集器进行收集的范围都是整个新生代或者老年代,而G1不再是这样。使用G1收集器时,java堆的内存布局就与其他收集器有很大差别,他将整个java划分为多个大小相等的独立区域(Region),虽然还保留有新生代和老年代概念,但新生代和老年代不再是物理隔离,他们都是一部分Region(不需要连续)的集合。

       (4)G1收集器之所以能建立可预测的停顿时间模型,是因为他可以有计划地避免在整个Java堆中进行全区域的垃圾收集。G1跟踪各个Regions里面的垃圾堆积的价值大小(回收所获得的空间大小及回收所需要时间的经验值),在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region(这也就是Garbage-Firsti名称的来由)。这种使用Region划分内存空间以及有优先级的区域回收方式,保证了G1收集器在有限的时间内可以获取尽可能高

你可能感兴趣的:(Java)