《JVM G1源码分析和调优》读书笔记

时间:2019-11-10 19:42:49   收藏:0   阅读:229

GC的相关算法与JVM的垃圾收集器

GC的相关算法

JVM垃圾收集器

P242 表11-1 不同类型垃圾回收期比较

G1基本概念

分区

G1是将内存分成一个个小区域使用。这些区域称之为Heap Region。扩展的有YHR(新生代分区),OHR(老生代分区),HHR(大对象分区)等等
为了达到分配效率与清理效率的平衡,HR的大小有上下限值,即1MB-32MB。结合整个堆空间分为2048个HR,那么通常G1管理的最大的堆是32MB*2048=64G。

新生代大小

用参数设置使得G1能推断出最大值与最小值

涉及的参数有:

如果G1推断出的新生代的最大值与最小值相等,则说明新生代不会动态变化,不会动态变化则可能导致后续新生代GC时不能满足期望的停顿时间,所以有文章提到G1不建议设置Xmn参数。

相关代码在 share/vm/gc_implementation/g1/g1collectorPolicy.cpp

G1启发式推断新生代大小

G1有一个线程专门抽样处理预测新生代列表的长度应该多大,并动态调整。

何时扩展以及一次扩展多少内存?
参数-XX:GCTimeRatio 表示GC与应用的耗费时间的比,G1默认是9。也就是说GC的耗时与应用耗时占比超过10%时,进行动态扩展。扩展大小的参数是G1ExpandByPercentOfAvailable,同时至少大于1MB,至多不能超过当前已经分配的大小的一倍。
代码在 size_t G1CollectorPolicy::expansion_amount()....
该书在第五章讲refine线程时对此点有更详细的阐述

G1停顿预测模型

比较偏数学 我就很快跳过去了
G1的预测逻辑是基于衰减平均(Decaying Average)和衰减标准差。

卡表和位图

卡表(CardTable)是CMS中中常见概念之一。我理解成分区间对象引用关系的描述 的存放处或者说存放的数据结构。此书也是讲的较为简略,细节可以参见《垃圾回收算法手册:自动内存管理的艺术》

对象头

讲JVM内存模型必讲对象头。可以参见我写的JVM中对象模型及相应名词概念

栈帧、线程等

栈帧可以参见 封亚飞 写的《揭秘Java虚拟机》第七章 Java栈帧,写的更详细。此书只是一笔带过,看了跟没看没啥差别。

G1的对象分配

TLAB快速分配的代码在 HeapWord* CollectedHeap::allocate_from_tlab...

G1的Refine线程

先讲Rset

Rset

Rset是干什么用的?

Rset写屏障

为啥谈到写屏障,因为Refine是线程关注的是应用关系的变更,但是他是如何识别引用关系的变更的呢?就是靠写屏障完成。下面讲写屏障相关要点:

Refine线程

新生代回收

上面已经讲了,G1 GC分三种: 新生代回收young、混合回收(mixed,既收集新生代也收集部分老年代)、FUll GC

步骤:

  1. 选择CSet
  2. 根处理
  3. Rset处理
  4. 复制
  5. Redirty 重构Rset
  6. 释放空间

相关日志

可以用-XX:G1LogLevel=finest 打开更详细的日志
关键字 GC pause (G1 Evacuation Pause) (young), 0.0182341 secs...

参数调优

混合回收

混合回收分成两个阶段:

并发标记阶段又分四个步骤:

  1. 初始标记子阶段(initital-mark)
  2. 并发标记子阶段(concurrent-mark)
  3. 再标记子阶段(remark,STW)
  4. 清理子阶段(cleanup,STW

并发标记的难点:
正在标记过程中的对象引用关系发生了改变。
通过三色标记法与STAB算法结合写屏障完成。
写屏障代码在 oop_store中,oop.inline.hpp

相关日志

关键字 GC pause (G1 Evacuation Pause) (mixed), 0.0106341 secs...
GC pause (G1 Evacuation Pause) (young) (initial-mark),.... // 初始标记借用了YGC
[GC concurrent-mark-start]...
[GC concurrent-mark-end]...
[GC remark ...]...
[GC cleanup ...]...

参数调优

Full GC

JDK10之前FGC是串行的,JDK10之后支持并行。
代码在 G1CollectedHeap::do_collection
串行回收采用标记清除算法,步骤:

  1. 标记活跃对象
  2. 计算新对象地址
  3. 把所有对象都更新到新地址上
  4. 移动对象完成压缩

相关日志

[Full GC (Allocation Failure) ..... 0.2036229 secs]....

G1调优

主要涉及的指标有: 吞吐量最大、停段时间尽量端、GC频率尽量低和堆空间的有效利用率高。
主要调优参数 参见P244 表11-2,主要涉及堆、RSet、标记和GC四个方面的参数。

原文:https://www.cnblogs.com/simoncook/p/11831289.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!