jvm15版本源码阅读之init_globals中universe_init的初始化
- 1 universe_init初始化
- 1.1 initialize_global_behaviours
- 1.2 GCLogPrecious::initialize
- 1.3 GCConfig::arguments()->initialize_heap_sizes
- 1.4 Universe::initialize_heap
- 1.5 Universe::initialize_tlab
- 1.6 Metaspace::global_initialize
- 1.7 MetaspaceCounters::initialize_performance_counters
- 1.8 CompressedClassSpaceCounters::initialize_performance_counters
- 1.9 AOTLoader::universe_init
- 1.10 ClassLoaderData::init_null_class_loader_data
- 1.11 SymbolTable::create_table
- 1.12 StringTable::create_table
- 1.13 ResolvedMethodTable::create_table
- 2 小结
这里开始进入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方法中接着分析剩下的初始化方法.