JVM(五)垃圾回收器

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

        串行垃圾回收器

        并行垃圾回收器

        CMS回收器

        G1回收器

串行回收器

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

如何理解独占:是将要进行GC回收时,程序所有的动作都停止。

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

并行回收器(ParNew回收器)

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

ParNew回收器是一个工作在新生代的垃圾收集器,它指事件的将串行回收器多线程化,它的回收策略和算法和串行回收器一样.

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

并行回收器(ParallelGC)

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

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

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

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

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

并行回收器(ParallelOldGC回收器)

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

-XX:+UserParallelOldGC

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

 

CMS回收器

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

使用 -XX:+UserConcMarkSweepGC 进行设置

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

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

之前我们在学习算法的时候说过,标记清除法有个缺点就是存在内存碎片的问题,那么CMS有个参数设置-XX:+UsrCMSCompactAtFullCollecion可以使CMS回收完成之后进行一次碎片整理,-XX:CMSFullGCsBeforeCompaction参数可以设置进行多少次CMS回收之后,对内存进行一次压缩.

 

cms回收器的好处:
1 支持并发(系统正在运行着产生垃圾,CMS回收器也可以进行垃圾回收)
2不需要考虑的内存不足,因为可以设置在某个阈值进行垃圾回收(每次垃圾回收都是回收老年代的垃圾,因为新生代比较不稳定)和它并不是独占的垃圾回收器。
3 出现碎片的问题可以进行用这2个参数调配(1 -XX:+UseCMSCompactAtFullCollecion 2-XX:+CMSFullGCsBeforeCompaction)调配。

 

 

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收集器

使用-XX:MaxGCPauseMillis指定最大停顿时间

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

G1 是1.7提出来的  最好现在先别用有坑,不过现在也在逐步的完善这个G1 

 

 

猜你喜欢

转载自blog.csdn.net/qq_32230309/article/details/81028074