jvm--垃圾收集器和算法

image.png

相关概念

并发和并行

这两个名词都是并发编程中的概念,在谈论垃圾收集器的上下文语境中,它们可以解释如下。

并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。

并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行于另一个CPU上。

Minor GC 和 Full GC

新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。

老年代GC(Major GC / Full GC):指发生在老年代的GC,出现了Major GC,经常会伴随至少一次的Minor GC(但非绝对的,在Parallel Scavenge收集器的收集策略里就有直接进行Major GC的策略选择过程)。Major GC的速度一般会比Minor GC慢10倍以上。

吞吐量

吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即

吞吐量 = 运行用户代码时间 /(运行用户代码时间 + 垃圾收集时间)。

虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。

一、垃圾收集器的种类

1,Serial 收集器:历史最悠久,单线程工作,回收垃圾时,必须暂停所有其它线程——stop the world,采用复制算法;

2,ParNew收集器:本质为Serial收集器的多线程版本,采用复制算法;

3,Parallel scavenge:具备自使用调节功能,以提供最合适的暂停时间和吞吐量,采用复制算法;

4,Serial old 收集器:是Serial 收集器的老年代版本,同样为单线程,但采用的是“标记-整理”算法;

5,Parallel old 收集器:Parallel scavenge 收集器的老年代版本,多线程,采用的是“标记-整理”算法;

6,CMS 收集器:即Concurrent Mark Sweep收集器,以获取最短停顿时间为目标,采用“标记-清除”算法;

7,G1 收集器: 即Garbage-First收集器,是目前最新的收集器,采用与其它收集器完全不通的设计思想,历时十年才实现商用,采用了混合算法,兼有“复制”和“标记-整理”算法的特点;

二、垃圾收集器的选择

JVM中,青年代和老年代特点迥异,青年代中对象“朝生夕死”的特点,回收频率较高,适合采用复制算法;而老年代则更适合“标记-整理”算法。鉴于此,JVM采用分代回收的策略:青年代采用复制算法的回收器,老年代采用“标记-整理”算法的回收器。

三、设置垃圾收集器参数

-XX:+UseSerialGC,虚拟机运行在Client模式下的默认值,Serial+Serial Old。

-XX:+UseParNewGC,ParNew+Serial Old,在JDK1.8被废弃,在JDK1.7还可以使用。

-XX:+UseConcMarkSweepGC,ParNew+CMS+Serial Old。

-XX:+UseParallelGC,虚拟机运行在Server模式下的默认值,Parallel Scavenge+Serial Old(PS Mark Sweep)。

-XX:+UseParallelOldGC,Parallel Scavenge+Parallel Old。

-XX:+UseG1GC,G1+G1。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容