20-Serial收集器+ParNew收集器

垃圾收集器

如果说收集算法是内存回收的方法论, 那垃圾收集器就是内存回收的实践者。《Java虚拟机规范》 中对垃圾收集器应该如何实现并没有做出任何规定, 因此不同的厂商、 不同版本的虚拟机所包含的垃圾收集器都可能会有很大差别, 不同的虚拟机一般也都会提供各种参数供用户根据自己的应用特点和要求组合出各个内存分代所使用的收集器。

1.Serial收集器

Serial收集器是最基础、 历史最悠久的收集器, 曾经(在JDK 1.3.1之前) 是HotSpot虚拟机新生代收集器的唯一选择。大家只看名字就能够猜到, 这个收集器是一个单线程工作的收集器, 但它的“单线程”的意义并不仅仅是说明它只会使用一个处理器或一条收集线程去完成垃圾收集工作, 更重要的是强调在它进行垃圾收集时, 必须暂停其他所有工作线程, 直到它收集结束。

“Stop The World”这个词语也许听起来很酷, 但这项工作是由虚拟机在后台自动发起和自动完成的, 在用户不可知、 不可控的情况下把用户的正常工作的线程全部停掉, 这对很多应用来说都是不能接受的。读者不妨试想一下, 要是你的电脑每运行一个小时就会暂停响应五分钟, 你会有什么样的心情?

下图体现了Serial/Serial Old收集器的运行过程 :

image

对于“Stop The World”带给用户的恶劣体验, 早期HotSpot虚拟机的设计者们表示完全理解, 但也同时表示非常委屈:“你妈妈在给你打扫房间的时候, 肯定也会让你老老实实地在椅子上或者房间外待着, 如果她一边打扫, 你一边乱扔纸屑, 这房间还能打扫完?”这确实是一个合情合理的矛盾, 虽然垃圾收集这项工作听起来和打扫房间属于一个工种, 但实际上肯定还要比打扫房间复杂得多!

从JDK 1.3开始, 一直到现在最新的JDK 13, HotSpot虚拟机开发团队为消除或者降低用户线程因垃圾收集而导致停顿的努力一直持续进行着, 从Serial收集器到Parallel收集器, 再到Concurrent Mark Sweep(CMS) 和Garbage First(G1) 收集器, 最终至现在垃圾收集器的最前沿成果Shenandoah和ZGC 等, 我们看到了一个个越来越构思精巧, 越来越优秀, 也越来越复杂的垃圾收集器不断涌现, 用户线程的停顿时间在持续缩短, 但是仍然没有办法彻底消除(这里不去讨论RTSJ中的收集器) , 探索更优秀垃圾收集器的工作仍在继续。

对于单核处理器或处理器核心数较少的环境来说, Serial收集器由于没有线程交互的开销, 专心做垃圾收集自然可以获得最高的单线程收集效率。在用户桌面的应用场景以及近年来流行的部分微服务应用中, 分配给虚拟机管理的内存一般来说并不会特别大, 收集几十兆甚至一两百兆的新生代(仅仅是指新生代使用的内存, 桌面应用甚少超过这个容量) , 垃圾收集的停顿时间完全可以控制在十几、 几十毫秒, 最多一百多毫秒以内, 只要不是频繁发生收集, 这点停顿时间对许多用户来说是完全可以接受的。所以,Serial收集器对于运行在客户端模式下的虚拟机来说是一个很好的选择。

2.ParNew收集器

在过去多年里,假设没有最新的G1垃圾回收器的话,通常线上系统都是ParNew垃圾回收器作为新生代的垃圾回收器,当然现在即使有了G1,其实很多线上系统还是用的ParNew。

我们运行在服务器上的Java系统,其实可以充分利用服务器的多核CPU资源的优势,比如通常服务器配置为4核CPU,如果我们使用Serial收集器单线程进行垃圾回收,是没有充分利用我们的CPU资源的。如下图:

image

根据上图我们也可以看出,当系统程序停止运行后,仅一个垃圾回收线程在工作,这个时候的多核CPU资源没有得到充分利用,因此我们的ParNew垃圾回收器主打的就是多线程垃圾回收机制,除了同时使用多条线程进行垃圾收集之外, 其余的行为包括Serial收集器可用的所有控制参数(例如:-XX:SurvivorRatio、 -XX:PretenureSizeThreshold、 -XX:HandlePromotionFailure等) 、 收集算法、 Stop The World、 对象分配规则、 回收策略等都与Serial收集器完全一致, 在实现上这两种收集器也共用了相当多的代码。

ParNew收集器的运行图如下:

image

ParNew收集器一旦在合适的时机执行Minor GC的时候,就会把系统程序的工作线程全部停掉,禁止程序继续运行创建新的对象,然后通过分配多个线程(理论上4核CPU可以支持4个垃圾回收线程并行执行)进行垃圾回收工作,提升性能,如下图:

image

当我们开发时想要系统指定使用ParNew垃圾回收器,通过直接指定JVM参数:“-XX:+UseParNewGC”即可。默认情况下,垃圾回收的线程数量跟我们的CPU的核数是一致的,比如我们线上机器是8核CPU,那么我们垃圾回收器对应的线程数量也可以达到8个。当然我们也可以手动修改线程数量:“-XX:ParallelGCThreads”参数即可。(建议一般不要修改,除非涉及到一些内存优化,后续我们再结合案例讲解)

小结

本篇文章先给大家介绍下我们的两个基础核心垃圾收集器,后续将继续为大家介绍CMS垃圾收集器以及G1收集器的工作原理。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容