垃圾收集器GC

Windows配置垃圾收集器

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

串行垃圾回收器

并行垃圾回收器

CMS回收器(主流)

G1回收器(发展中)

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

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

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

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

并行回收 ParalleIGC

新生代ParalleIGC回收器,使用了复制算法的收集器,也是多线程独占形式的收集器(本质还是串行的),但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回收器也是一种多线程的回收器,和新生代的

ParallelGC回收器一样,也是一种关注吞吐量的回收器,他使用了标记压缩算法进行实现。

-XX:+UseParallelOldGC进行设置

-XX:+ParallelGC Threads也可以设置垃圾收集时的线程数量。

CMS

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

使用-XX:+UseconcMarkSweepGC进行设置。

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

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

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

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

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

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

分代GC:G1依然是一个分代的收集器,但是它是兼顾新生代和老年代一起工作,之前的垃圾收集器他们或者在新生代工作,或者在老年代工作,因此这是一个很大的不同。空间整理:G1在回收过程中,不会像CMS那样在若干次GC后需要进行碎片整理,G1采用了有效复制对象的方式,减少空间碎片。

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

使用-XX:+UseG1GC应用G1收集器,

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

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

配置垃圾收集器遵循两个原则

1、根据计算及性能功能

2、尽量使用主流的垃圾收集器

垃圾回收主要关注老年代,因为老年代中的数据会停留很长时间

通过JMeter对Tomcat增加压力,不同的虚拟机参数应该会有不同的表现

目的:

观察不同配置参数对吞吐量的影响

测试串行回收器

-XX:+PrintGC Details -Xmx32M -Xms32M 最大堆32M初始化32M

-XX:+HeapDumpOnOutOfMemoryError  打印内存溢出信息

-XX:+UseSeriaIGC  使用串行单核一个线程的垃圾回收

-XX:PermSize=32M  方法区32M

扩大堆内存以提升系统性能

-XX:+PrintGCDetails -Xmx51 2M -Xms32M 最大堆512M

-XX:+HeapDumpOnOutOfMemoryError

-XX:+UseSeriaIGC

-XX:PermSize=32M

-Xloggc:d:/gc.log 日志文件放到D盘下

调整初始堆大小

-XX:+PrintGC Details -Xmx51 2M -Xms64M  初始堆大小64M

-XX:+HeapDumpOnOutOfMemoryError

-XX:+UseSeriaIGC

-XX:PermSize= :32M

-Xloggc:d:/gc.log

并行回收器

测试ParNew回收器的表现

-XX:+PrintGCDetails -Xmx51 2M -Xms128M

-XX:+HeapDumpOnOutOfMemoryError

-XX:+UseParNewGC  使用多核GC

-XX:PermSize= :32M

-Xloggc:d:/gc.log

使用ParallelOldGC回收器

-XX:+PrintGCDetails -Xmx512M -Xms64M

-XX:+HeapDumpOnOutOfMemoryError

-XX:+UseParalleIGC 新生代

-XX:+UseParallelOldGC 老年代

-Xx:ParalleIGC Threads=8  使用8个线程进行回收

-Xx:PermSize=32M

测试CMS回收器的性能

-XX:+PrintGCDetails -Xmx51 2M -Xms64M

-XX:+HeapDumpOnOutOfMemoryError

-XX:+UseConcMarkSweepGC

-XX:ConcGC Threads=8

-XX:PermSize= =32M

-Xloggc:d:/gc.log

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JAVA代码搬运工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值