2021-03-15 08:55发布
JVM垃圾回收器有几种?
ParNew其实就是Serial的多线程版本,除了使用多线程之外,其余参数和Serial一模一样。俗称:并行垃圾回收器,采用复制算法进行垃圾回收
多线程
并行垃圾回收器
复制算法
ParNew默认开启的线程数与CPU数量相同,在CPU核数很多的机器上,可以通过参数-XX:ParallelGCThreads来设置线程数。
-XX:ParallelGCThreads
它是目前新生代首选的垃圾回收器,因为除了ParNew之外,它是唯一一个能与老年代CMS配合工作的。
它同样存在Stop The World问题
使用-XX:+UseParNewGC参数可以设置新生代使用这个并行回收器
-XX:+UseParNewGC
ParallelGC使用复制算法回收垃圾,也是多线程的。
就是非常关注系统的吞吐量,吞吐量=代码运行时间/(代码运行时间+垃圾收集时间)
吞吐量
代码运行时间
垃圾收集时间
-XX:MaxGCPauseMillis:设置最大垃圾收集停顿时间,可用把虚拟机在GC停顿的时间控制在MaxGCPauseMillis范围内,如果希望减少GC停顿时间可以将MaxGCPauseMillis设置的很小,但是会导致GC频繁,从而增加了GC的总时间,降低了吞吐量。所以需要根据实际情况设置该值。
-XX:MaxGCPauseMillis
GC频繁
总时间
降低
-Xx:GCTimeRatio:设置吞吐量大小,它是一个0到100之间的整数,默认情况下他的取值是99,那么系统将花费不超过1/(1+n)的时间用于垃圾回收,也就是1/(1+99)=1%的时间。
-Xx:GCTimeRatio
99
1/(1+n)
1/(1+99)=1%
另外还可以指定-XX:+UseAdaptiveSizePolicy打开自适应模式,在这种模式下,新生代的大小、eden、from/to的比例,以及晋升老年代的对象年龄参数会被自动调整,以达到在堆大小、吞吐量和停顿时间之间的平衡点。
-XX:+UseAdaptiveSizePolicy
使用-XX:+UseParallelGC参数可以设置新生代使用这个并行回收器
SerialOld是Serial回收器的老年代回收器版本,它同样是一个单线程回收器。
老年代
单线程
一个是在JDK1.5及之前的版本中与Parallel Scavenge收集器搭配使用,
另一个就是作为CMS收集器的后备预案,如果CMS出现Concurrent Mode Failure,则SerialOld将作为后备收集器。
使用算法:标记 - 整理算法
使用算法
老年代ParallelOldGC回收器也是一种多线程的回收器,和新生代的ParallelGC回收器一样,也是一种关注吞吐量的回收器,他使用了标记压缩算法进行实现。
ParallelOldGC
标记压缩算法
-XX:+UseParallelOldGc进行设置老年代使用该回收器
-XX:+UseParallelOldGc
-XX:+ParallelGCThreads也可以设置垃圾收集时的线程数量。
-XX:+ParallelGCThreads
CMS全称为:Concurrent Mark Sweep意为并发标记清除,他使用的是标记清除法。主要关注系统停顿时间。
标记清除法
使用-XX:+UseConcMarkSweepGC进行设置老年代使用该回收器。
-XX:+UseConcMarkSweepGC
使用-XX:ConcGCThreads设置并发线程数量。
-XX:ConcGCThreads
CMS并不是独占的回收器,也就说CMS回收的过程中,应用程序仍然在不停的工作,又会有新的垃圾不断的产生,所以在使用CMS的过程中应该确保应用程序的内存足够可用。
CMS不会等到应用程序饱和的时候才去回收垃圾,而是在某一阀值的时候开始回收,回收阀值可用指定的参数进行配置:-XX:CMSInitiatingoccupancyFraction来指定,默认为68,也就是说当老年代的空间使用率达到68%的时候,会执行CMS回收。
饱和
-XX:CMSInitiatingoccupancyFraction
68
使用率
68%
执行
如果内存使用率增长的很快,在CMS执行的过程中,已经出现了内存不足的情况,此时CMS回收就会失败,虚拟机将启动老年代串行回收器;SerialOldGC进行垃圾回收,这会导致应用程序中断,直到垃圾回收完成后才会正常工作。
串行
SerialOldGC
这个过程GC的停顿时间可能较长,所以-XX:CMSInitiatingoccupancyFraction的设置要根据实际的情况。
标记清除法有个缺点就是存在内存碎片的问题,那么CMS有个参数设置-XX:+UseCMSCompactAtFullCollecion可以使CMS回收完成之后进行一次碎片整理。
内存碎片
-XX:+UseCMSCompactAtFullCollecion
碎片整理
-XX:CMSFullGCsBeforeCompaction参数可以设置进行多少次CMS回收之后,对内存进行一次压缩。
-XX:CMSFullGCsBeforeCompaction
压缩
最多设置5个标签!
ParNew 垃圾回收器
ParNew其实就是Serial的
多线程
版本,除了使用多线程之外,其余参数和Serial一模一样。俗称:并行垃圾回收器
,采用复制算法
进行垃圾回收特点
ParNew默认开启的线程数与CPU数量相同,在CPU核数很多的机器上,可以通过参数
-XX:ParallelGCThreads
来设置线程数。它是目前新生代首选的垃圾回收器,因为除了ParNew之外,它是唯一一个能与老年代CMS配合工作的。
它同样存在Stop The World问题
使用
-XX:+UseParNewGC
参数可以设置新生代使用这个并行回收器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的比例,以及晋升老年代的对象年龄参数会被自动调整,以达到在堆大小、吞吐量和停顿时间之间的平衡点。使用-XX:+UseParallelGC参数可以设置新生代使用这个并行回收器
老年代垃圾回收器
SerialOld 垃圾回收器
SerialOld是Serial回收器的
老年代
回收器版本,它同样是一个单线程
回收器。用途
一个是在JDK1.5及之前的版本中与Parallel Scavenge收集器搭配使用,
另一个就是作为CMS收集器的后备预案,如果CMS出现Concurrent Mode Failure,则SerialOld将作为后备收集器。
使用算法
:标记 - 整理算法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回收就会失败,虚拟机将启动老年代
串行
回收器;SerialOldGC
进行垃圾回收,这会导致应用程序中断,直到垃圾回收完成后才会正常工作。这个过程GC的停顿时间可能较长,所以
-XX:CMSInitiatingoccupancyFraction
的设置要根据实际的情况。标记清除法有个缺点就是存在
内存碎片
的问题,那么CMS有个参数设置-XX:+UseCMSCompactAtFullCollecion
可以使CMS回收完成之后进行一次碎片整理
。-XX:CMSFullGCsBeforeCompaction
参数可以设置进行多少次CMS回收之后,对内存进行一次压缩
。一周热门 更多>