JVM垃圾处理机制
Posted Kirl z
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM垃圾处理机制相关的知识,希望对你有一定的参考价值。
JVM垃圾处理机制(三)
1. 垃圾收集器
- ParNew + CMS 用户体验优先
- Parallel Scavenge + Parallel Old 吞吐量优先, 性能优先
- G1 用户体验优先
gc 中的并行和并发
- 并行: 用户线程暂停, 垃圾回收线程执行 (用户线程不停的有对象加入/ 删除引用链, 垃圾回收线程需要暂停保证当前清除的都是垃圾)
- 并发: 用户线程, 垃圾回收线程同时执行
用户线程暂停:
用户线程和 gc 线程并发的执行, 用户线程可能会让一些垃圾对象重新加入引用, 此时去清理垃圾就不行
在某些时间, 需要暂停用户线程, 只运行 gc 线程
垃圾收集器考虑的两个指标
- 用户体验优先: 单次停顿时间越短越好, 总的停顿时间可以长一点 (吞吐量低一点) , 也可以接受
- 吞吐量优先: 总的停顿时间越短越好, 单次停顿时间可以长一点
1.1 Serial收集器(新生代收集器,串行GC)
特性:
- 新生代
- 单线程
- 复制算法
串行: 暂停用户线程
1.2 ParNew收集器(新生代收集器,并行GC)
- 新生代
- 复制算法
- Serial 的多线程版本
- 搭配 CMS 收集器 , 用户体验优先的应用使用
1.3 Parallel Scavenge收集器(新生代收集器,并行GC)
- 新生代
- 复制算法
- 搭配 Parallel Old 作为吞吐量优先的引用使用
- 可控制吞吐量
- 自适应的调节策略: 部分JVM参数 (如新生代大小, 晋升的年龄阈值等) 可以动态设置
1.4 Serial Old收集器(老年代收集器,串行GC)
- Serial 老年代版本
- 单线程
- 标记-整理算法
1.5 Parallel Old收集器(老年代收集器,并行GC)
- 标记-整理算法
- 多线程
- 吞吐量优先
1.6 CMS收集器(老年代收集器,并发GC)
CMS 收集器是一种以获取最短回收停顿时间为目标的收集器
并发收集, 低停顿
标记-清除算法
整个过程分为4个步骤
初始标记(CMS initial mark)
初始标记仅仅只是标记一下GC Roots能直接关联到的对象,速度很快,需要“Stop TheWorld”。
并发标记(CMS concurrent mark)
并发标记阶段就是进行GC Roots Tracing的过程。
重新标记(CMS remark)
重新标记阶段是为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记的时间短,仍然需要“Stop The World”。
并发清除(CMS concurrent sweep)
并发清除阶段会清除对象。
耗时最长的第2, 4个阶段, 都是并发执行 (用户线程, gc线程), 整体看, cms就是并发gc (大部分时间)
缺陷:
- 用户体验优先, 就寻在性能低下 (CPU花更多时间执行gc)
- 浮动垃圾问题
- 内存碎片问题
什么是浮动垃圾?
cms第4个阶段, 用户线程并发执行产生新的对象, 其中包含垃圾对象(浮动垃圾)
浮动垃圾会产生什么问题?
- 需要预留空间: 基于cms收集器的老年代gc, 不能等老年代满了才执行gc, 而需要预留空间给 cms 第四个阶段中, 用户线程并发执行创建的对象
- 并发模式失败: 预留空间还不够
解决方案: 当次gc还在cms的第4个阶段执行, 但又出发另一次的老年代 gc (使用 Serial Old) , 但是这种情况, 会带来停顿时间急剧增加
1.7 G1收集器(唯一一款全区域的垃圾回收器)
- G1圾回收器是用在heap memory很大的情况下,把heap划分为很多很多的region块,然后并行的对其进行垃圾回收。
- G1垃圾回收器回收region的时候基本不会STW,而是基于 most garbage优先回收(整体来看是基于"标记-整理"算法,从局部(两个region之间)基于"复制"算法) 的策略来对region进行垃圾回收的。
- 用户体验优先
- G1垃圾回收器在清除实例所占用的内存空间后,还会做内存压缩。
新生代gc
老年代gc
- 初始标记: 和cms类似, 但是可以和 minor gc (新生代gc) 并发执行
- 并发标记(Concurrent Mark)阶段 - 在这个阶段G1做的事情跟CMS一样。但G1同时还多做了一件事情,就是如果在Concurrent Mark阶段中,发现哪些Tenured region中对象的存活率很小或者基本没有对象存活,那么G1就会在这个阶段将其回收掉,而不用等到后面的cleanup阶段。这也是Garbage First名字的由来。同时,在该阶段,G1会计算每个 region的对象存活率,方便后面的clean up阶段使用 。
- 最终标记: 和CMS一样, 只是使用不同算法
- 筛选回收: 可以和 minor gc 并发执行
2. 内存分配和垃圾回收策略
以上是关于JVM垃圾处理机制的主要内容,如果未能解决你的问题,请参考以下文章