「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战」
垃圾回收器
Serial 、Serial Old 垃圾回收器
分别回收新生代和老年代对象,单线程运行,回收时停止其他工作线程,卡住不动
ParNew、CMS 垃圾回收器
ParNew新生代回收器,多线程并发
ParNew回收器,针对新生代垃圾回收器,采用的是复制算法,具体看上面的回收算法。 如何指定使用ParNew呢?—— -XX:+UseParNewGC ParNew默认的回收线程数—— 跟CPU核数一样,假如你是8核CPU,那就有8个回收线程。 也可以通过使用参数“-XX:ParallelGCThreads”指定线程数,但不建议。
关于ParNew与Serial谁好谁坏的问题,回答还是看情况,看你的运行环境,是单核环境还是多核。
CMS老年代回收器,多线程并发
采用的算法为“标记-整理清除”
分为四个阶段:初始标记-> 并发标记-> 重新标记 -> 并发清理
初始标记 这阶段会造成"Stop the World"暂停程序的工作,将现有的实例对象有GC roots进行标识. 但仅仅进行标识,造成的停顿影响不大。
并发标记 这阶段不会造成停顿,允许程序创造新的对象,而它又尽可能检查所有对象的GC Roots情况,将有引用的实例对象标识起来。但追溯实例对象的GC Roots会很耗费时间
重新标记 这里主要针对阶段二的情况,阶段二在标识的同时又运行程序新建对象,这难免有漏网之鱼。他会造成“Stop The World",对一些失去引用又或者有引用的进行标识,速度也很快。
并发清理 前面的工作都是进行标识,区别出谁是垃圾,谁又有用,而人生有何尝不是有很多设限的条条框框呢,过的开心就好。这个阶段它很耗时,但不影响系统程序的运行,跟着系统程序并发运行,它只需要默默的将前阶段的垃圾回收就好。
小结:虽然初始标记与重新标识会造成Stop the World,但造成的影响不大,而并发标记与并发清理,虽然很耗费时间,但也与系统程序并发运行,不影响程序的运行。
G1垃圾回收器
统一收集新生代和老年代,更优秀的算法和设置机制