首页 > 编程知识 正文

jvm垃圾回收器有哪些,Jvm垃圾回收器

时间:2023-05-05 12:08:59 阅读:201687 作者:4388

JVM垃圾回收器的几种类型 一、垃圾收集器的种类1、Serial收集器2、ParNew收集器3、Parallel Scavenge收集器4、Serial Old 和 Parellel Old5、Concurrent Mark Sweep收集器6、G1收集器 二、收集器的组合使用

一、垃圾收集器的种类

前言:JVM内存大致可分为堆、栈、方法区,GC的作用主要是对堆中的对象实例进行垃圾回收。目前商业虚拟机的垃圾收集都采用“分代收集”算法,该算法根据对象实例存活的周期将内存划分为skdyb代和老年代。其中skdyb代按存活的时间分为伊甸区,幸存代0,幸存代1;老年代中是经过多次GC回收后仍然存活下来的对象(默认15次),还有大对象会直接进入老年代。

1、Serial收集器

Serial收集器是一个作用于skdyb代的 ‘单线程’的收集器,这里单线程不仅代表它只有一条线程进行垃圾回收,还代表这个收集器工作时,必须stop the world(STW),用户线程全部暂停,直到它收集结束。
开启参数:-XX:+UseSerialGC
适用范围:用户的桌面应用场景(IDE工具的应用场景)

2、ParNew收集器

ParNew收集器,作用于skdyb代,简单的理解就是Serial收集器的多线程版本,在回收时有多个线程同时进行垃圾回收工作,其余的基本与Serial收集器一致。
开启参数:-XX:+UseParNewGC
适用范围:Server首选的skdyb代收集器

3、Parallel Scavenge收集器

Parallel Scavenge收集器是一个skdyb代多线程收集器,其最重要的一个特性是用户可以控制吞吐量。控制参数为
-XX:MaxGCPauseMillis(最大垃圾收集停顿时间/ms);-XX:GCTimeRatio(吞吐量百分比,0-100之间);通过以上两个参数,Parallel Scavenge收集器可以控制吞吐量的大小,具体的吞吐量计算公式为:运行用户代码的时间/(运行用户代码的时间+GC时间)例如吞吐量是99%,那么99%的时间是用户线程执行的时间,1%的时间是GC的时间。垃圾收集停顿时间越短,响应速度越快,用户体验越好。但是不要盲目的减小垃圾收集的停顿时间,还是需要结合系统自身,完成一次垃圾收集需要的时间来设定,否则得不偿失。
开启参数:-XX:+UseParallelGC
适用范围:后台计算不需要太多交互的场景

4、Serial Old 和 Parellel Old

分别是Serial收集器和Parellel Scavenge的老年代收集器版本,使用标记-整理算法进行垃圾回收。

5、Concurrent Mark Sweep收集器

CMS收集器,作用于老年代区域,是一种以获取最短回收停顿时间为目标的收集器,基于比标记-清除算法实现,整个过程分为4步,初始标记(单线程,STW)、并发标记(多线程)、重新标记(多线程,STW),并发清除(多线程)。特点为低停顿,在互联网站和Web服务端适用广泛。该收集器有三个可设置的的参数:
1)-XX:CMSInitiatingOccupancyFraction=70:代表老年代中占用70%的空间就会启用CMS收集器。
2)-XX:+UseCMSCompactAtFullCollection:CMS是不会移动内存的, 因此, 这个非常容易产生碎片, 导致内存不够用, 因此, 内存的压缩这个时候就会被启用。 增加这个参数是个好习惯。可能会影响性能,但是可以消除碎片。
3)-XX:+CMSFullGCsBeforeCompaction:设置多少次GC后进行内存压缩。

开启参数:-XX:+UseConcMarkSweepGC

6、G1收集器

G1收集器是目前唯一一个能在skdyb代和老年代都能使用的垃圾收集器,其算法是将堆分为若干个区域,但它仍然属于分代收集器。G1提供了两种GC模式:Yong GC和Mixed GC。
开启参数:-XX:+UseG1GC

二、收集器的组合使用

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。