zoukankan      html  css  js  c++  java
  • 04_垃圾回收器

    【简述】

    在Java虚拟机中,垃圾回收器不仅仅只有一种,什么情况下该使用哪种,对性能又有什么样的影响,这都是我们需要了解的。

    主要的垃圾回收器有这么几种:

    1.串行垃圾回收器

    2.并行垃圾回收器

    3.CMS回收器

    4.G1回收器

    【串行垃圾回收器】

    串行回收器是指使用单线程进行垃圾回收的回收器,每次回收时,串行回收器只有一个工作线程,对于并行能力较弱的计算机来说,串行回收器的专注性和独占性往往有更好的性能表现,串行回收器可以在新生代和老年代使用,根据作用域不同的堆空间,分为新生代串行回收器和老年代串行回收器。

    -XX:+UseSerialGC  参数可以设置使用新生代串行回收器和老年代串行回收器。

    【并行回收器——ParNew回收器】

    并行回收器在串行回收器基础上做了改进,它可以使用多个线程同时进行垃圾回收,对于计算能力强的计算机而言,可以有效缩短垃圾回收所需要的实际时间。

    ParNew回收器是一个工作在新生代的垃圾回收器,它只是简单的将串行回收器多线程化,它的回收策略和算法与串行回收器一样。

    -XX:+UseParNewGC新生代ParNew回收器,老年代则使用串行回收器。ParNew回收器工作时的线程数量可以使用 -XX:ParallelGCThreads参数指定,一般最好和计算机的CPU相当,避免过多的线程影响性能。

    【并行回收器——ParallelGC回收器】 

    新生代ParallelGC回收器,使用了复制算法的收集器,也是多线程独占形式的收集器,但ParallelGC回收器有个非常重要的特点,就是它非常关注系统的吞吐量。

    提供了两个非常关键的参数控制系统的吞吐量。

    -XX:MaxGCPauseMillis  设置最大垃圾回收停顿时间,可用虚拟机在GC停顿的时间控制在MaxGCPAuseMillis范围内,如果希望减少GC的停顿时间可以将MaxGCPauseMillis设置的很小,但是会导致GC频繁,从而增加了GC的总时间,降低了吞吐量,所以需要根据时间情况设置该值。

    -XX:GCTimeRatio  设置吞吐量大小,它是一个0~100之间的整数,默认情况下它的取值是99,那么系统将花费不超过1/(1+n)的时间用于垃圾回收,也就是1/(1+99)=1%的时间。

    另外可以指定  -XX:UseAdaptiveSizePolicy打开自适应模式,在这种模式下,新生代的大小、eden、from/to的比例,以及晋升老年代的对象年龄参数会被自动调整,以达到在堆大小、吞吐量和停顿时间之间的平衡点。

    【并行回收器——ParallelOldGC回收器】

    老年代ParallelOldGC回收器也是一种多线程的回收器,和新生代的ParallelGC回收器一样,也是一种关注吞吐量的回收器,它使用了标记压缩算法进行实现。

    -XX:+UseParallelOldGC  进行设置

    -XX:+ParallelGCThreads  也可以设置垃圾回收时的线程数量

    【CMS回收器】

    CMS回收器全称为:Concurrent Mark Sweep  意为并发标记清除,它使用的是标记清除法,主要关注系统停顿时间。

    -XX:+UseConcMarkSweepGC  进行设置

    -XX:ConcGCThreads  设置并发线程数量

    CMS 并不是独占的回收器,也就是说CMS回收的过程中,应用程序仍然在不停地工作,又会有新的垃圾不断地产生,所以在使用CMS的过程中应该确保应用程序的内存足够可用。CMS不会等到应用程序饱和的时候才会去回收垃圾,而是在某一阈值的时候开始回收,回收器阈值可用指定的参数进行配置,-XX:CMSInitiatingOccupancyFraction来指定,默认为68,也就是说当老年代的空间使用率达到68%的时候,会执行CMS回收,如果内存使用率增长地很快,在CMS执行的过程中,已经出现了内存不足的情况,此时CMS回收就会失败,虚拟机将启动老年代串行回收器进行垃圾回收,这回导致应用程序中断,直到垃圾回收器完成后应用程序才会正常工作,这个过程GC的停顿时间可能会比较长,所以 -XX:CMSInitiatingOccupancyFraction的设置要根据实际的情况。 

        标记清除法有个缺点是内存碎片的问题,那么CMS有个参数设置 -XX:+UseCMSCompactAtFullCollection可以使CMS回收完成之后进行一次碎片整理,-XX:CMSFullGCsBeforeCompaction参数可以设置进行多少次CMS回收之后,对内存进行一次压缩。

    【G1回收器】

    G1回收器(Garbage-First)是在jdk1.7中提出的垃圾回收器,从长期目标来看是为了取代CMS回收器,G1回收器拥有独特的垃圾回收策略,G1属于分代垃圾回收器,区分新生代和老年代,依然有eden和from/to区,它并不要求整个eden区或者新生代、老年代的空间都连续,它使用了分区算法。

    并行性:G1回收期间可多线程同时工作

    并发性:G1拥有与应用程序交替执行的能力,部分工作可与应用程序同时执行,在整个GC期间不会完全阻塞应用程序。

    分代GC:G1依然是一个分代的收集器,但是它是兼顾新生代和老年代一起工作,之前的垃圾回收器要么在新生代工作,要么在老年代工作,因此这是一个很大的不同。

    空间整理:G1在回收过程中,不会像CMS那样在若干次GC后需要进行碎片整理,G1采用了有效复制对象的方式,减少空间碎片。

    可预见性:由于分区的原因,G1可以只选取部分区域进行回收,减少了回收的范围,提升了性能。

    -XX:+UseG1GC  应用G1回收器

    -XX:MaxGCPauseMillils 指定最大停顿时间

    -XX:ParallelGCThreads  设置并行回收的线程数量

  • 相关阅读:
    QOMO Linux 4.0 正式版发布
    LinkChecker 8.1 发布,网页链接检查
    pgBadger 2.1 发布,PG 日志分析
    Aletheia 0.1.1 发布,HTTP 调试工具
    Teiid 8.2 Beta1 发布,数据虚拟化系统
    zLogFabric 2.2 发布,集中式日志存储系统
    开源电子工作套件 Arduino Start Kit 登场
    Piwik 1.9 发布,网站访问统计系统
    Ruby 1.9.3p286 发布,安全修复版本
    toBraille 1.1.2 发布,Java 盲文库
  • 原文地址:https://www.cnblogs.com/HigginCui/p/8450127.html
Copyright © 2011-2022 走看看