JVM学习日记⭐️Parallel Scavenge收集器的特点及设计思想⭐️

404 阅读3分钟

“这是我参与8月更文挑战的第21天,活动详情查看:8月更文挑战

🔉引言

前面我偷了懒,因为周五那天实在太累,接下来把周五欠的补上,要不我这偷工减料的心我自己都过意不去😃,今天我们接着来逐一介绍:前面没有提到的垃圾回收器。想看【上】的小伙伴可以点击【传送门】去看看。

⭐️经典的垃圾收集器

Parallel Scavenge收集器

Parallel Scavenge收集器也是一款新生代收集器,同样是基于标记-复制算法进行收集,也是可以进行并行收集的,看起来和我们前面介绍的Parallel收集器没什么区别,那可不是呀,如果没有区别为何还要浪费笔墨区分呢?就像我们普通人如果没有和别人不同的地方,那凭什么别人就要记住你呢?

吞吐量

CMS等垃圾收集器的重点在于时间上,即如何缩短线程暂停时间,但Parallel Scavenge收集器的侧重点在于如何达到一个可控制的吞吐量Through put),那啥是吞吐量呢?我们可以这样理解:单位时间内可以处理的任务数。那我们如何在CPU层面衡量这个问题呢?那就需要知道消耗CPU的时间是由哪些部分组成的,主要就是两部分:

  • 运行用户代码的时间
  • 运行垃圾回收的时间

那如果我们能保证进行垃圾回收的时间足够小比如占比只有1%,那我们就可以说吞吐量是99%。公式如下:

TeX吞吐量:运行用户代码的时间/运行用户代码的时间+运行垃圾回收的时间\TeX吞吐量:运行用户代码的时间/运行用户代码的时间+运行垃圾回收的时间

那高吞吐量有什么意义呢?主要在于可以最高效率的利用处理器资源,尽量完成程序运行的任务,这个很好理解,就不多解释了。

参数

你不是说Parallel Scavenge收集器能精准控制吞吐量嘛?那我怎么控制呢?Parallel Scavenge收集器给我们提供了两个参数用于干这事:

  • 设置最大垃圾收集停顿时间 -XX:MaxGCPauseMillis
  • 直接设置吞吐量大小:-XX:GCTimeRatio

那参数值有什么意义呢?怎么规定呢?你可真是个好奇宝宝,-XX:MaxGCPauseMillis允许值是大于0的毫秒数,那我这个值是不是设置越小,垃圾收集停顿时间就越短呢?当然不是呀,那垃圾收集停顿时间缩短到底会影响哪些因素呢?首先Parallel Scavenge收集器是针对新生代的,你把新生代调小自然每个垃圾收集停顿时间就会短一些,但你不要忘了,由于内存小了,也会导致垃圾收集更加频繁,虽然每次的停顿时间确实下降,但吞吐量也降下来了。

那不行,我们看下一个参数:-XX:GCTimeRatio,它由于是一个Ratio,所以取值范围是0-100之间,可以看成是吞吐量的倒数,默认值是99,即允许最大1%的垃圾回收时间。

此外,Parallel Scavenge收集器还有一个好玩的参数也同样值得我们关注,-XX:+UseAdaptiveSizePolicy,这是一个开关参数,有什么用呢?类似于一个魔盒,就是一旦你把这个潘多拉魔盒打开,那虚拟机就会根据程序运行的情况和监控信息动态的去调整一些参数,来保证最合适的吞吐量和停顿时间,这也叫垃圾收集的自适应策略😎(GC Ergonomics)。

📝题外话

我坚信,世界上的财富无法促进人类发展,即使它掌握在那些仍想达到此目标的人手中也无济于事。唯有以伟大而纯洁的人物为榜样,才能引发高尚的思想和行为的产生。金钱只能滋生人们的自私自利,并使其不能自持地加以滥用。

谁能想象摩西、耶稣或者甘地像卡耐基那样腰缠万贯呢?

大声告诉我:下一个世界首富是不是你😛?