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  设置并行回收的线程数量

  • 相关阅读:
    HDU 5791 Two(训练题002 F)
    HDU 5783 Divide the Sequence (训练题002 B)
    关于01背包和完全背包二重循环的顺序(前人之技,后人惊叹)
    关于01背包求第k优解
    最长上升子序列(logN算法)
    ACM课程总结
    Problem F
    关于狄克斯特拉算法(dijkstra)总结
    Problem I
    OBJ文件格式分析工具: objdump, nm,ar
  • 原文地址:https://www.cnblogs.com/HigginCui/p/8450127.html
Copyright © 2011-2022 走看看