jvm15版本源码阅读之init_globals中universe_init的初始化


  这里开始进入universe_init方法.

1 universe_init初始化

1.1 initialize_global_behaviours

  此方法是设置与编译相关的一些全局转态.

1.2 GCLogPrecious::initialize

  设置了与gc日志相关的一些全局参数,比如行数和互斥锁等.

1.3 GCConfig::arguments()->initialize_heap_sizes

  此处是设置堆大小.需要注意的是,设置堆大小是从arguments出发的,进入可知,是根据gc的参数类来具体实现的,如果使用G1,则构建G1的堆,如果使用ZGC,则构建Z的堆.这里以Z的堆大小设置为例.
  首先进入GCConfig::arguments,
在这里插入图片描述
  可见,该arguments方法返回的是GCArguments类指针,进入GCArguments类.
在这里插入图片描述

  该类的方法几乎都是虚方法,所以肯定是在其继承类中实现的相关方法,这里以ZGC为例,来说明堆的初始化.
  首先找出该类的所有继承类,如下所示
在这里插入图片描述

  有epsilon,G1,Gen,shenandoah和Z,这里选取Z的继承类.
  另一方面,从arguments()->initialize_heap_sizes进入,
在这里插入图片描述
  顺序执行initialize_alignments,initialize_heap_flags_and_sizes和initialize_size_info方法,在Z的实现中,分别进入相对应的方法中.
  1 initialize_alignments
  初始化分配单位,只是设置了一个常数值,主要就是ZGranuleSize的值
在这里插入图片描述
  进入
在这里插入图片描述
  使用了位操作,这里具体是2^21,也就是2M,所以Z的堆大小分配单元为2M.
  2 initialize_heap_flags_and_sizes
  Z没有实现,默认使用的是GCArguments的该方法,进入该方法
在这里插入图片描述
  其中的MaxHeapSize,MinHeapSize和InitialHeapSize就是jvm的启动时设定的参数,同时在堆空间中以分配单元为划分堆空间的单位,进行了对齐,此时堆空间就是由这些分配单元所组成.

  3 initialize_size_info
  Z没有实现,使用的依然是GCArguments的该方法,进入该方法
在这里插入图片描述

  只是记录了堆大小的一些参数.
  后面两个方法Z没重写的原因是Z没有使用分代的垃圾收集策略,而是使用的染色指针的方式.

1.4 Universe::initialize_heap

  此方法对所有的垃圾回收方式进行了全局的初始化,进入该方法
在这里插入图片描述
  1 arguments()->create_heap
  进入Z的实现方法
在这里插入图片描述
  可见直接调用了ZCollectedHeap的构造方法,进入该方法
在这里插入图片描述

  可见,只是初始化了一些私有属性,主体方法为空
  2 initialize
  进入Z的该方法,

在这里插入图片描述
  执行了calculate_verify_data方法,进入该方法
在这里插入图片描述

  只是确认了一些值,首先是确认了max和min的值,最后确认了mask和bits的值.

1.5 Universe::initialize_tlab

  初始化线程本地缓存.

1.6 Metaspace::global_initialize

  元空间初始化,包括GC和内存大小等

1.7 MetaspaceCounters::initialize_performance_counters

  初始化元空间运行的一些统计指针.

1.8 CompressedClassSpaceCounters::initialize_performance_counters

  这个主要是针对是否启用永久区,否则和之前的MetaspaceCounters::initialize_performance_counters一样.

1.9 AOTLoader::universe_init

  AOT编译的加载器初始化,默认是不开启的.

1.10 ClassLoaderData::init_null_class_loader_data

  主要是在元空间添加bootstrap加载器的信息和饮用.

1.11 SymbolTable::create_table

  创建符号表,进入该方法
在这里插入图片描述

  进入SymbolTableHash的构造方法
在这里插入图片描述

  可见,它是一个别名,是ConcurrentHashTable的别名,vm在这里有一个内部使用的ConcurrentHashTable数据结构.

1.12 StringTable::create_table

  和SymbolTable::create_table一样,也是一个ConcurrentHashTable数据结构

1.13 ResolvedMethodTable::create_table

  和SymbolTable::create_table一样,也是一个ConcurrentHashTable数据结构

2 小结

  至此,关于universe_init方法的执行分析结束.可以看到,在此方法内先调用了通用方法初始化了堆大小,再调用各个不同类型的堆来进行具体的初始化.后续会回到init_globals方法中接着分析剩下的初始化方法.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值