Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 24

垃圾收集器 & 性能监控

© 2006-2020 明略科技 版权所有


Part 1 垃圾收集器
1. 判断对象是否存活
2. 垃圾收集算法
3. 垃圾收集器

© 2006-2020 明略科技 版权所有 2


1.1 判断对象是否存活
1. 通过一系列称为“ GC Roots” 的根对象作为起始节点集

可达性分析算法 2. 从这些节点开始,根据引用关系向下搜索

3. 如果从 GC Roots 到某个对象不可达时,则证明此对象是不


可能再被使用的。

© 2006-2020 明略科技 版权所有


1.2 垃圾收集算法
标记 - 清除算法

1. 先通过根节点标记所有可达对象
2. 然后清除所有不可达对象,完成垃圾
回收

缺点:
1. 产生内存碎片

© 2006-2020 明略科技 版权所有


标记 - 整理算法

1. 通过根节点标记出所有可达对象

2. 将所有的可达对象都移动到一端

3. 清理边界外的空间,即可完成回收工作

优点:

1. 没有内存碎片

缺点:

1. 相对标记 - 清除,效率较

© 2006-2020 明略科技 版权所有
1. 将原有的内存空间分为两块,每次只使用其中一块

2. 在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内
存块中
复制算法
3. 清除正在使用的内存块中的所有对象,交换两个内存的角色,完成
垃圾回收

优点:

1. 没有内存碎片
2. 相比整理算法,效率更高

缺点:

1. 浪费一半内存

© 2006-2020 明略科技 版权所有


分代收集理论 Young GC

Old GC
特点:大约 90% 多的新建对象会被很快回收

改进版复制算法
新生代:
Eden 空间、 Survivor 空间
( From 、 To )

常见比例: 8 : 1 : 1
优点:
不再是只能使用一半内存
缺点:
需要额外空间进行分配担保

新生代 / 老年代比例: 1 : 2

© 2006-2020 明略科技 版权所有


1.3 经典垃圾收集器

1. 新生代 ( 复制 ) / 老年代(清除、整
理)

2. 串行 / 并行 / 并发

3. G1“ 全功能收集器”

© 2006-2020 明略科技 版权所有


Serial 收集器 / Serial Old 收集

Parallel Scavenge 收集器 / Parallel Old 收集器

© 2006-2020 明略科技 版权所有


ParNew 收集器 / CMS 收集器

CMS ( Concurrent Mark Sweep )收集器: 1. 低停顿 2. 并发收集 3. -


XX:CMSInitiatingOccupancyFraction

 初始标记:标记 GC Roots 能直接关联的对象

 并发标记:从 GC Roots 直接关联的对象开始遍历整个对象图的过程

 重新标记:修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录

 并发清除:清理删除掉标记阶段判断的已经死亡的对象

© 2006-2020 明略科技 版权所有


G1 收集器

Garbage First 收集器:


1. 可预测的停顿时间模型( -XX:MaxGCPauseMillis ,默认值 200ms )
2. Mixed GC (回收整个新生代和部分老年代,将可回收的 Region 组成回收集,优先回收收益最大的部
分)
3. -XX:InitiatingHeapOccupancyPercent

基于 Region 的堆内存布局:
1. 划分多个大小相等的独立区域( Region )
2. 遵循分代收集理论
3. region 根据需要,可以扮演不同角色
4. 不同角色的 Region 采用不同的策略回收
5. Humongous 区域,专门存储大对象
6. -XX:G1HeapRegionSize ,取值 1MB ~ 32MB

“Garbage First” :
让 G1 收集器去跟踪各个 Region 里面的垃圾堆积的
“ 价值”大小,价值即回收所获得的空间大小以及回收所需时间的经验值,维护一个优先级列表,
根据用户设定的期望停顿时间,优先回收价值收益最大的那些 Region© 2006-2020 明略科技 版权所有
G1 收集器的运作过程中的筛选回收阶段:

 负责更新 Region 的统计数据,对各个 Region 的回收价值和成本进行排序


 根据用户所期望的停顿时间来指定回收计划,可以自由选择任意多个
Region 构成回收集
 然后把决定回收的那一部分 Region 的存活对象复制到空的 Region 中,再
清理掉整个旧 Region 的全部空间。

筛选回收须暂停用户线程:
 涉及存活对象的移动
 考虑过设计成并发操作,但比较复杂,考虑到 G1 只是回收一部分 Region ,
停顿时间是用户可控的,把这个特性放到之后的低延迟收集器(即 ZGC )

© 2006-2020 明略科技 版权所有


CMS 收集器的后备预案: Serial Old 收集

 CMS 运行期间预留的内存无法满足程序分配新对象的需要,就会出现一次“并
发失败”( Concurrent Mode Failure ),临时启用 Serial Old 收集器来重新进
行老年代的垃圾收集

G1 收集器的后备预案: Full GC
 在特别繁忙的场合会出现在回收过程中内存不充足的情况。当遇到这种情况时,
G1 会转入一个 Full GC 进行回收。

© 2006-2020 明略科技 版权所有


ZGC 收集器

ZGC 是一款在 JDK11 中新加入的具有实验性质的


低延迟垃圾收集器:
 停顿时间限制在 10 毫秒以内
 停顿时间不会随着堆的大小而增加
 支持 4TB 内存
 不设分代
 实现可并发的标记 - 复制算法
(读屏障、染色指针和内存多重映射等技术)

ZGC 的 Region 可以具有大、中、小三类容量:


 小型 Region :容量固定为 2MB ,用于放置小于 256KB 的小对象
 中型 Region :容量固定为 32MB ,用于放置 256KB~4MB 的对象
 大型 Region :容量不固定,可以动态变化,但必须为 2MB 的整数倍,用于放置 4MB 或以上的大
对象

© 2006-2020 明略科技 版权所有


 并发标记:遍历对象图做可达性分析的阶段

 并发预备重分配:根据特定的查询条件统计得出本次收集过程要清理哪些 Region ,将这些 Region 组


成重分配集( Relocation Set )

 并发重分配:把 RSet 中的存活对象复制到新的 Region 上,并为重分配集中的每个 Region 维护一个转


发表,记录从旧对象到新对象的转向关系

 并发重映射:修正整个堆中指向重分配集中旧对象的所有引用

© 2006-2020 明略科技 版权所有


Part 2 性能监控
1. JDK 自带的命令行

© 2006-2020 明略科技 版权所有 16


2.1 JDK 性能监控工具

jps :虚拟机进程状况工具

© 2006-2020 明略科技 版权所有


jstack : Java 堆栈跟踪工具

jstack 命令用于生成当前虚拟机内每一条线程正在执行的方法堆栈的集合。

生成线程快照的目的通常是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资
源导致的长时间挂起等,都是导致线程长时间停顿的常见原因。

© 2006-2020 明略科技 版权所有


top

top -Hp 42767

© 2006-2020 明略科技 版权所有


42792 -> a728

© 2006-2020 明略科技 版权所有


jmap : Java 内存映像工具

jmap 命令用于生成堆转储快照

© 2006-2020 明略科技 版权所有


jstat :虚拟机统计信息监视工具

 S0 、 S1 : Survivor 空间比例
 E : Eden 空间比例
 O : Old 空间比例
 M : Metaspace 比例
 CCS :压缩类空间
 YGC : Young GC 次数
 YGCT : Young GC 时间
 FGC : Full GC 次数
 FGCT : Full GC 时间
 GCT :所有 GC 总耗时

© 2006-2020 明略科技 版权所有


jinfo : Java 配置信息工具

jinfo 的作用是实时查看和调整虚拟机各项参数。

© 2006-2020 明略科技 版权所有


www.mininglamp.com

THANKS
中国领先的一站式企业级人工智能产品与服务平台

© 2006-2020 明略科技 版权所有

You might also like