jvm 整理
jvm 垃圾收集器,垃圾收集算法
垃圾收集算法
复制算法
标记清除算法
标记整理算法
垃圾收集器,以及垃圾收集器使用的收集算法
垃圾收集器的变化进程 serial -> paralle -> cms -> g1 -> zGC
在发展的过程中,用户进程的停止时间都是越来越小的,也就是STW 是越来越小的。
serial
serial 收集器为初代垃圾收集器,为串行收集方式,新生代使用复制算法,老年代使用标记-整理算法
其由于简单,高效, 没有线程交互的开销,在单cpu下具有极高的收集效率。但是再其工作期间需要stw
显示使用方式: -XX:+UseSerialGC
parNew
parNew 收集器为 多线程版本的 serial, 默认垃圾线程收集数量为 CPU 数量。
其他行为和 serial 一致
parallel scanvage
其为新生代垃圾收集器,使用复制算法实现,主要关注点在 吞吐量上,垃圾收集时间 / 垃圾收集时间 + 用户线程运行时间
其提供了两个控制参数, 最大停顿时间(-XX:MaxGCPauseMillis) / 垃圾收集时间占比(-XX:GCTimeRatio)
当然停顿时间并不是越小越好,是以内存空间和回收频率为代价的。
当然也提供了 另一种策略,可以自己不设置,使用自适应策略,jvm 根据自身情况,根据当前系统运行情况收集监控信息,
动态调整新生代的比例、老年大大小等细节参数,以提供最合适的停顿时间或最大的吞吐量,这种调节方式称为GC自适应的调节策略。
serial old
老年代收集器,串行。 标记 -》整理
同时,其还承担着,当CMS 出现 concurrent mode failure 的时候 作为后备收集器功能。
parallel old
老年代收集器,并行。 标记 -》整理
cms
是一款专注于 最短回收停顿时间的 收集器。
收集过程如下:
处理标记 -》 并发标记 -> 重新标记 -》 并发清除
- 首先标记GC roots 直接关联到的对象,速度很快 stw
- 并发标记 GC. roots 能关联到的对象, 较慢
- 重新标记,标记在 并发标记期间 由于用户线程继续运作,导致标记产生变动的那一部分对象。 stw
- 并发整理。
观察可见,其并不是全程都为并行的,在1 和 4 也是需要 stw 的,由于该阶段耗时较少,所以整体上来看,还是性能极高的。
缺点:
- 对cpu资源敏感,由于其在标记和清理阶段 都是和用户进程一起,会导致总吞吐量降低,程序变慢。
- 无法处理浮动垃圾,在并发清理阶段产生的垃圾无法在档次收集处理掉,需要等待下次进行处理。 由于收集线程和用户线程同时运行。
所以在并发收集的时间点,不能是在内存空间不够用的时候开始,需要预留一定的buffer,以保证在收集过程中,用户线程可以正常运行。 - 其基于 标记 -》 清理,会导致碎片产生,可以配置几次收集之后执行一次 压缩。在cms 顶不住的时候,可以直接开启 full GC, 同时可以设置
在几次full GC 之后 执行 内存压缩,默认为 0, 也就是每次full GC 都会执行内存压缩行为。
g1
zgc
参考资料 :