JVM G1源码分析和调优书 阅读笔记 一

G1 垃圾回收器 分区 Heap Region,下限是1MB,上限是32MB,默认整个堆空间分为2048个分区region

1.通过G1HeapRegionSize可以指定大小,默认值为0

2.不指定region大小,由G1启发式推断HR大小 ---- 根据堆空间最大值和最小值,以及HR的个数进行推断

如果G1 是启发式推断新生代的大小,扩张时如果有空闲的分区列表,就直接加入到新生代分区列表。没有就分配新的分区,然后再加入到新生代分区列表。G1有一个线程专门抽样处理预测新生代列表的长度应该多大,并动态调整。

G1 自适应扩展内存空间,默认 计算 G1 GC 时间与应用时间占比不超过10%,就不需要扩展空间,GC时间超过这个阈值10%,可以动态扩展,还可以根据一个参数配置扩展的比例 (最少不能少于1M,最多是当前已分配内存的一倍)

2.2 G1 停顿预测模型

    根据这个模型统计计算出来的历史数据,来预测本次收集需要选择的堆分区数量。预测逻辑是基于衰减平均值和衰减标准差

2.3  卡表和位图

    GC 引入卡表是对内存的引用关系做标记,从而根据引用关系快速遍历活跃对象

    G1 在混合收集算法中用到了并发标记,在并发标记的时候,使用了bitMap来描述对象的分配情况

2.4 对象头 

      JVM 设计了对象的数据结构 :  对象头,实例数据和对齐填充 

     JVM 对象头 分为两部分 :

        标记信息 :位于MarkOop,包括锁状态,是否偏向锁,锁状态标志位(轻量级锁00,偏向锁01, GC 11

        元数据信息 : 指向Klass 对象

             把0X12345678 先看成一个地址,然后强制转换成OOP结构,再判断这个OOP是否含有Klass指针,如果有认为是一个指针,没有认为这是一个立即数。

2.5 内存分配和管理 

      JVM 中常见的对象类型 :

       ResourceObj : 线程有一个资源空间,一般存放ResourceObj

       StackObj : 栈对象,不提供功能,禁止new 和 delete

        ValueObj : 值对象,在堆对象需要进行嵌套时使用,对象分配的位置和宿主对象是一样的。

        AllStatic : 静态对象,全局对象,只有一个

        Metaspace : 元对象,比如InstanceKlass 这样的元数据就是元对象

        CHeapObj : 堆空间的对象,由new/delete/free/malloc管理

只有老年代分区 到新生代分区的引用 或者 老年代分区到老年代分区应用,需要使用RSet,记录非收集部分指向收集部分的指针集合,这个集合也就是描述对象的引用关系。

ObjA.field = ObjB , G1的RSet,会在ObjB的RSet记录ObjA的地址,也就是记录谁使用我

发布了331 篇原创文章 · 获赞 1 · 访问量 3514

猜你喜欢

转载自blog.csdn.net/kuaipao19950507/article/details/103656977