JVM学习JVM · Java虚拟机原理 · JVM上语言·框架· 生态系统JVM

GC(5)、Serial、ParNew、Parallel Sca

2017-09-08  本文已影响79人  编程界的小学生

一、首先需要引入几个概念
1、Stop-The-World
(1.1)概念:
java中一种全局暂停的现象。
全局暂停------所有java代码停止(但是native代码是可以执行的,但不能和JVM交互)。
大多数都是由于GC引起的。

(1.2)为什么GC会出现Stop-The-World(全局暂停)?
这样想或许能理解:你妈在打扫房间,但是你一直吃瓜子往地上吐皮,这时候又有新的垃圾产生,房间永远打扫不干净,只有让你停止嗑瓜子,才能打扫干净。GC也是一个道理。

(1.3)危害:
长时间服务停止,未响应。客户早就跑了。

2、安全点(Safepoint)
(2.1)概念:
再“特定的位置”记录了信息,这些位置称为安全点。即程序执行时并非在所有地方都能停顿下来开始GC,只有到达安全点才会暂停。

(2.2)什么情况会产生上述的“特定的位置”?
以“是否具有让程序长时间执行的特征”为标准来选取。最明显的特征就是指令序列服用,例如方法调用,循环跳转和异常跳转等这些才会可能产生安全点。

(2.3)如何让GC发生时,让所有线程(不包含JNI调用的)都跑到最近的安全点上停顿下来?
两种方案:
抢先式中断(Preemptive Suspension):在GC发生时,首先把所有线程全中断,若发现有线程中断的地方不在安全点上,就恢复线程,让他跑到安全点上。(此方式几乎没有虚拟机还在采用)

主动式中断(Voluntary Suspension):当GC需要中断线程的时候,不直接对线程操作,仅仅简单的设置一个标志,各个线程执行时主动去轮询这个标志,发现中断标志为真时就自己中断挂起轮询标志的地方和安全点是重合的,另外再加上创建对象需要分配内存的地方。

3、安全区域(Safe Region)
(3.1)若程序不执行,那怎么达到安全点?
比如线程处于Sleep或者Blocked状态,这时候线程无法响应JVM的中断请求,“走”到安全的地方去中断挂起。那怎么办?这时候需要靠安全区域来解决。

(3.2)在线程执行到Safe Region中的代码时,首先标志自己已经进入了Safe Region,那么,当在这段时间里JVM要发起GC时候,就不管标志自己为Safe Region状态的线程了,在线程要离开Safe Region时,他要检查系统是否已经完成了根节点枚举(或者是整个GC过程),如果完成了,那线程就继续执行,否则他就必须等待直到收到可以安全离开Safe Region的信号为止。

4、串行
(4.1)优点:
最古老、最稳定,效率高

(4.1)缺点:
可能会产生较长的停顿(Stop-The-World)

5、并行和并发
这两个概念容易混淆。
并行是你在某一时刻不仅在扫地同时还在打电话。同一时刻干了多件事。
并发是在某一时刻某件事被干了多次,产生了高并发。

二、Serial收集器(串行)
是一个单线程的收集器,他在工作时,必须暂停其他所有的工作线程(Stop-The-World),直到他收集结束。这是难以忍受的,但是他的效率较高。

Paste_Image.png

三、ParNew收集器(并行)
是Serial收集器的多线程版本。

Paste_Image.png

四、Parallel Scavenge收集器(并行)
是一个新生代收集器,他也是使用复制算法。他的目标规则是达到一个可控制的吞吐量。
吞吐量就是CPU用于运行用户代码的时间与CPU总消耗时间的比值,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间),虚拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那么吞吐量就是99%。

五、Serial Old收集器
Serial Old是Serial收集器的老年代版本,他同样是一个单线程收集器,使用标记-整理算法。

Paste_Image.png

六、Parallel Old收集器
Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和标记-整理算法。

Paste_Image.png

若有兴趣,欢迎来加入群,【Java初学者学习交流群】:458430385,此群有Java开发人员、UI设计人员和前端工程师。有问必答,共同探讨学习,一起进步!
欢迎关注我的微信公众号【Java码农社区】,会定时推送各种干货:


qrcode_for_gh_577b64e73701_258.jpg
上一篇下一篇

猜你喜欢

热点阅读