Hotspot源码解析-第十三章-全局模块初始化

2024-01-04 19:28

本文主要是介绍Hotspot源码解析-第十三章-全局模块初始化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第十三章-全局模块初始化

这一章主要对全局模块初始化有个大概轮廓,知道初始了哪些模块,做了哪些事情,具体的细节,会根据重要程度在后面各章节中一一体现。

13.1 初始全局模块

13.1.1 init.cpp

13.1.1.1 init_globals
jint init_globals() {HandleMark hm;// 管理模块初始化,包括时间统计、各种指标计数、性能数据统计、运行时数据统计和监控、类加载服务情况(加载类数量、加载类失败数量、加载字节数等)management_init();// 字节码初始化。Hotspot执行字节码时,大部分是解释执行,这就需要将字节码转换成机器码来执行,执行前需要知道字节码是什么格式、类型、占用长度、结果类型等信息,这一步就是做这些初始化工作的bytecodes_init();// 类加载器初始化classLoader_init();// 代码缓存空间初始化。虚拟机为了提升执行绩效,会把一些热点指令代码提前编译为机器码并缓存起来,这一步就是做这个操作的codeCache_init();// 虚拟机版本号初始化VM_Version_init();// os的扩展初始化,jdk8版本的hotspot里,这个函数没做任何具体实现os_init_globals();// JVM虚拟机调用Java程序时需要借助stub存根来处理,大家做rpc/webservice就了解stub存根的意义,就是对远程调用函数的一个声明/映射,这里的stubRoutines的意思与这个差不多,这个比较关键,后面章节会重点细讲stubRoutines_init1();// universe 翻译就是万物的意思,这一步初始化,主要是对元空间内存、各种符号表、字符表、Java堆内存空间jint status = universe_init();  if (status != JNI_OK)return status;// 解释器初始化interpreter_init();  // 方法调用计数初始化invocationCounter_init();  // 标记清除初始化,GC相关的,后面讲GC时再讲marksweep_init();// 这个仅仅是校验AccessFlags的大小,里面是一个assert断言accessFlags_init();// 模板表 TemplateTable 的初始化,TemplateTable中保存了各个字节码的执行模板(目标代码生成函数和参数)templateTable_init();// 这个函数没做什么,就是通过系统调用srand设置了随机数的随机种子,方便rand()调用时根据种子生成一个伪随机数InterfaceSupport_init();// 生成运行时的一些stub函数,例如错误方法处理的stub、静态解析处理的stub等SharedRuntime::generate_stubs();// universe_init的进一步初始化,里面内容很多,主要概括为对基础数据类型、数组类型、对象类型创建对应的Klass对象、bootstrap类加载器的初始化等universe2_init();  // 引用处理器初始化referenceProcessor_init();// JNI句柄分配空间块并初始化jni_handles_init();
#if INCLUDE_VM_STRUCTSvmStructs_init(); // vm内部数据结构的初始化
#endif // INCLUDE_VM_STRUCTS// 初始化vtable数组的大小,并预分配数组空间,vtable(虚函数表)是c++中对虚函数表的存储和表示vtableStubs_init();// 代码缓冲区初始化InlineCacheBuffer_init();// oracle编译器初始化compilerOracle_init();// 代理编译初始化,主要做两件事:1.选择编译器;2.如何进行编译compilationPolicy_init();// 编译日志记录compileBroker_init();// 初始化寄存器数组,给每个寄存器初始化名字,汇编代码需要VMRegImpl::set_regName();// 初始化universe后的逻辑操作,包括加载基础类、构建报错信息、安全检查、加载器、引用管理等,用过spring的就知道里面有很多post后置逻辑操作if (!universe_post_init()) {return JNI_ERR;}// 系统及java class的初始化javaClasses_init();  // stubRoutines的第二阶段初始化stubRoutines_init2(); #if INCLUDE_NMTNMT_stack_walkable = true;
#endif // INCLUDE_NMT// 打印完成标志if (PrintFlagsFinal) {CommandLineFlags::printFlags(tty, false);}// 返回初始化成功标志return JNI_OK;
}

这篇关于Hotspot源码解析-第十三章-全局模块初始化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/570355

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

c++的初始化列表与const成员

初始化列表与const成员 const成员 使用const修饰的类、结构、联合的成员变量,在类对象创建完成前一定要初始化。 不能在构造函数中初始化const成员,因为执行构造函数时,类对象已经创建完成,只有类对象创建完成才能调用成员函数,构造函数虽然特殊但也是成员函数。 在定义const成员时进行初始化,该语法只有在C11语法标准下才支持。 初始化列表 在构造函数小括号后面,主要用于给