深入理解JVM-垃圾收集器的选择

1.概述

JAVA中不同于C++的地方在于,JAVA程序员只需关心创建对象,回收对象由垃圾回收器负责。而C/C++程序员既需要负责创建也要负责回收。
之前的文章我们了解了JVM的内存区域,知道了我们创建的对象几乎都在堆中。所以垃圾收集器主要是作用在堆的。我们知道堆可以细分为新生代和老年代。有些垃圾收集器(Sirial,ParNew,Parallel Scavenge)作用在新生代,有些垃圾收集器(CMS,Serial,Paraller Old)作用在老年代,还有一种特殊的、同时作用在新生代和老年代的垃圾收集器(G1)。

2.经典的垃圾收集器

在这里插入图片描述
两个收集器间有连线,表明它们可以搭配使用
连线上有JDK9表明的是,在JDK9之后这两个取消了ParNew加Serial Old以及Serial加CMS这两组收集器组合的支持(虽然原本就很少人这样用),并直接取消了-XX:+UserParNewGC参数,意味着ParNew和CMS从此只能搭配使用。可以理解成ParNew合并入CMS,成为专门处理新生代的组成部分。

若不清楚具体的收集器,点击这里

3.垃圾收集器的选择

垃圾收集器的性能指标由三个方面决定:
1.吞吐量

吞吐量:指的是运行用户代码的时间与处理器总消耗时间的比值。吞吐量越高、系统在单位时间内完成的用户代码越多。

2.内存占用
3.延迟时间

这三者共同构成了一个不可能三角(意思就是三者此消彼长)
三者的总体表现会随着技术进步越来越好,但是要三个方面同时具有卓越的表现是及其困难甚至是不可能的,一款优秀的收集器通常最多可以同时达成其中的两项。

我认为垃圾收集器可以分为两个大类
1.计算场景(吞吐量优先)

  1. Parallel Scavenge
  2. Parallel Old

2.交互式场景(响应速度优先)

  1. Serial
  2. ParNew
  3. Serial Old
  4. CMS
  5. G1

计算场景的选择
现在基本上家庭主机都不会是单核CPU,建议使用Parallel Scavenge+Parallel Old收集器
虽然在JDK7和JDK8这是默认的收集器,但在JDK9默认使用的是G1
所以这里也给出配置参数
+XX:UseParallelGC
+XX:UseParallelOldGC

交互式场景的选择(网站后端)停顿时间直接影响服务质量
1.当CPU是单核时,应使用Serial+Serial Old这种单线程收集器。使用多线程反而会增加线程切换的消耗。通常我们学生服务器都是单核的,所以可以使用+XX:UseSerialGC来进行配置。
2.当CPU是多核时,对于大概4-6G以下的堆内存,建议使用CMS。-XX:+UseConcMarkSweepGC
对于更大的堆内存,使用G1收集器效果更好。+XX:UseG1GC

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值