JVM垃圾回收器的几种类型

一、垃圾收集器的种类

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

1、Serial收集器

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

2、ParNew收集器

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

3、Parallel Scavenge收集器

Parallel Scavenge收集器是一个新生代多线程收集器,其最重要的一个特性是用户可以控制吞吐量。控制参数为
-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收集器的分代算法模型G1收集器是目前唯一一个能在新生代和老年代都能使用的垃圾收集器,其算法是将堆分为若干个区域,但它仍然属于分代收集器。G1提供了两种GC模式:Yong GC和Mixed GC。
开启参数:-XX:+UseG1GC

二、收集器的组合使用

以上描述的垃圾收集器可以如图搭配使用

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JVM(Java虚拟机)垃圾回收是负责管理内存的重要组件。它负责清理不再使用的对象,以便为新对象腾出空间。在Java中,常见的垃圾回收有以下几种: 1. Serial(串行)垃圾回收:它是最早实现的垃圾回收,使用单线程进行垃圾回收。它会暂停应用程序的所有线程,并逐个扫描内存中的对象进行回收。虽然效率较低,但对于小型应用程序或单核处理的系统来说是一个不错的选择。 2. Parallel(并行)垃圾回收:与串行垃圾回收类似,但它使用多个线程并行进行垃圾回收。这样可以提高回收效率,但需要更多的系统资源。它适用于多CPU系统,可以加快垃圾回收的速度。 3. CMS(Concurrent Mark and Sweep,并发标记清除)垃圾回收:它是一种并发回收,允许应用程序在垃圾回收过程中继续运行。它使用多个线程来标记和清除内存中的垃圾对象。此外,CMS使用了一种增量算法,避免了长时间的停顿时间,对于对停顿时间敏感的应用程序来说是一种选择。 4. G1(Garbage First)垃圾回收:它是JDK 7中引入的一种新型垃圾回收。G1使用分区的方式管理堆内存,将整个堆分成多个小块。通过基于目标停顿时间的方式,它可以根据应用程序的需求来选择性地回收不再使用的对象,以减少停顿时间和提高吞吐量。 不同的垃圾回收适用于不同的应用场景,开发人员可以根据应用程序的需求和系统配置来选择合适的垃圾回收
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值