当前位置: 首页 > news >正文

Java虚拟机精讲【2.4】

第4章剖析HotSpot的Launcher

JVM 只有由启动器成功启动之后,才能够正常运行,而在 HotSpot 中 Launcher 就承担着这个任务。对于绝大多数的 Java 开发人员而言,或许并不是很清楚 HotSpot 的启动过程与细节,那么从本章开始,笔者将会带领大家一起走进 HotSpot 的源码世界中去一探究竟。

4.1 HotSpot的源码目录结构

在开始正式深入学习 HotSpot 的源码之前,大家首先需要明白 HotSpot 的源码目录结构是怎样构成的,以及每一个目录中所包含的特定功能模块实现是什么。只有在彻底弄清楚这些问题后,才能更有针对性地阅读和学习 HotSpot 的源码。尽管 HotSpot 只是属于 OpenJDK项目中的一个功能子集,但是 HotSpot 却在整个 OpenJDK 项目中占据了非常重要的地位;所以本书只会针对 HotSpot 项目的源码进行讲解,大家只需关注 HotSpot 即可。

在解压后的 HotSpot 源码目录下,主要由 agent、 make、 src 和 test 这 4 个子目录构成了HotSpot 源码的整体目录结构。其中 agent 目录下包含了 Serviceability Agent 的客户端实现; make 目录下包含了用于 build 出 HotSpot 的各种配置文件;而 src 目录则是其中最重要的一个子目录,该目录下包含了 HotSpot 的所有源码实现(比如:与 CPU 的相关实现、与操作系统的相关实现、与平台无关的通用实现、 HotSpot 的核心功能实现、各类 GC 的实现,以及执行引擎的相关实现等);至于 test 目录下仅仅只是包含了 HotSpot 相关的一些单元测试用例。

在此需要提醒大家,尽管 Java 继承了 C 语言的语法结构,并改编了 C++语言的对象模型,但是彼此之间仍然存在着一定的语法差异。所以 Java 开发人员在阅读 HotSpot 的源码时,千万不要停留在语法细节上钻牛角尖,只需要关注具体的数据结构和算法即可。

① HotSpot 的源码目录结构引用自博文: http://hllvm.group.iteye.com/group/topic/26998。

4.2 Launcher简介

Launcher 是一种用于启动 JVM 进程的启动器,并且可以根据类别划分为两种不同的Launcher,一种是正式版的启动器,也就是大家在 Windows 平台下经常用到的 java.exe 和javaw.exe 程序。前者在运行时会保留控制台,以及显示程序的输出信息。而后者主要是用于执行 Java 的 GUI 程序,也就是说,使用 javaw.exe 执行 Java 程序时将不会显示任何的程序的输出信息。关于 Launcher 的具体使用方式和标准选项配置,大家可以在控制台中输入命令“ java-help”,如下所示。

具体用法: java [-options] class [args...](执行类) 或 java [-options] -jar jarfile [args...](执行 jar 文件) 其中选项包括: -d32 使用 32 位数据模型(如果可用) -d64 使用 64 位数据模型(如果可用) -client 选择"client"VM -server 选择"server"VM -hotspot 是"client"VM 的同义词[已过时], 默认 VM 是 client -cp 目录和 zip/jar 文件的类搜索路径 -classpath 目录和 zip/jar 文件的类搜索路径用“ ;”分隔的 目录,JAR 档案和 ZIP 档案列表, 用于搜索类文件 -D<name>=<value> 设置系统属性 -verbose[:class|gc|jni] 启用详细输出 -version 输出产品版本并退出 -version:<value> 需要指定的版本才能运行 -showversion 输出产品版本并继续 -jre-restrict-search|-no-jre-res trict-search 在版本搜索中包括/排除用户专用 JRE -? –help 输出此帮助消息 -X 输出非标准选项的帮助 -ea[:<packagename>...|:<classname>] -enableassertions[:<packagename> ...|:<classname>] 按指定的粒度启用断言 -disableassertions[:<packagename >...|:<classname>] 禁用具有指定粒度的断言 -esa | -enablesystemassertions 启用系统断言 -dsa | -disablesystemassertions 禁用系统断言 -agentlib:<libname>[=<options>] 加 载 本 机 代 理 库 <libname>, 例 如 -agentlib: hprof, 另 请 参 阅 -agentlib:jdwp=help 和 -agentlib:hprof=help -agentpath:<pathname>[=<options>] 按完整路径名加载本机代理库 -javaagent:<jarpath>[=<options>] 加载 Java 编程语言代理, 请参阅 java.lang. instrument -splash:<imagepath> 使用指定的图像显示启动屏幕

大家千万不要认为 Launcher 就是虚拟机实现,其实从严格意义上来说, Launcher 只是一个封装了虚拟机的执行外壳,由它负责装载 JRE 环境和 Windows 平台下的 jvm.dll 动态链接库( Linux 平台下则是装载 libjvm.so)。 在一个 JVM 的进程内部,只能执行一个指定的 Java程序,也就是说,当执行多个 Java 程序时,也就意味着同时启动了多个 JVM 进程。在 1.5.6节中,本书示例了如何编译一个 Debug 版本的 HotSpot,所以为了调试跟踪方面,大家可以使用 Java 的另一种启动器 gamma。在 HotSpot 中 Launcher 是使用 C 语言编写的,对比 gamma和 java 后不难发现两者的源码几乎是一模一样的,仅存在少量差异,也就是说, 在 OpenJDK中 gamma 和 java 是共用的同一套 Launcher 源码实现。 gamma 的源码在 HotSpot 的源码目录下,大家可以在/hotspot/src/share/tools/launcher/java.c 中找到。而 java 却并非包含在 HotSpot的源码目录下,而是包含在/jdk/src/share/bin/main.c 中。

尽管 Launcher 并非是 HotSpot 的核心,甚至应该算是 HotSpot 中比较“外围”的功能模块,但既然是这样,笔者为什么还需要大费周章地对 Launcher 的源码进行剖析?其实了解Launcher 的执行原理是非常有意义的。既然 Launcher 是 JVM 的启动器,那么必然会由它负责调用 HotSpot 的核心代码对 JVM 执行初始化,以及由它负责维护 JVM 的整个生命周期,所以理解 Launcher 的执行原理,是迈进 HotSpot 的第一步。

4.3 跟踪Launcher的执行过程

本书并非只是一本单纯讲解 Java 虚拟机原理的理论性读物,从本章开始,大家将会从以往的枯燥和乏味中深入到 HotSpot 的具体实现细节上。对于那些曾经想要深入研究 JVM技术却又止步于源码面前的 Java 开发人员而言,本书的知识点将会是你们迫切想要得到的答案。

尽管每一个 Java 开发人员对 Launcher 的使用都非常熟悉,但这并不代表对 Launcher的执行过程也了如指掌,所以本章将会重点讲解关于 Launcher 的执行过程并剖析源码细节。由于 HotSpot 的 Launcher 是采用 C 语言编写的, 所以对于具备一定 C 语言功底的读者阅读,必然是最好不过的。但如果你仅仅只是专攻于 Java 技术,也并非无法理解本章的一些源码示例,毕竟 Java 的语法结
http://www.jsqmd.com/news/721517/

相关文章:

  • VideoMamba:高效视频理解的新架构与技术解析
  • 服装老板别乱跑银行!揭秘:为什么找对助贷中介,贷款成功率翻倍? - 速递信息
  • 用Python的SymPy和Matplotlib搞定高数作业:从求导到解微分方程,保姆级代码分享
  • 为什么特斯拉Model Y中控响应快3倍?逆向解析其C#通信栈中的RingBuffer+Hardware-Accelerated CRC优化(含可商用移植代码片段)
  • NCM文件解密工具全面解析:轻松转换网易云音乐加密格式
  • 从ROH到FERT:一文讲透SAP中10种常见物料类型的后台配置差异与业务含义
  • 当SHAP值遇上XGBoost/LightGBM:模型解释的实战陷阱与调优指南
  • 保姆级排错指南:Ubuntu安装GStreamer VAAPI插件后,为什么`gst-inspect`还是找不到vaapi?
  • 激光雷达点云与距离图像转换技术解析
  • PlantUML甘特图进阶玩法:自定义样式、关联JIRA任务、嵌入Confluence,打造可视化项目管理中心
  • 桑拿房安装公司排名 - 速递信息
  • PHP 8.9异步I/O工业级实践(含Swoole 5.1+OpenSSL 3.2双栈压测报告)
  • SoC验证IP选型指南:商用VIP核心价值与评估维度
  • 别再死记硬背了!用Python+Matplotlib动态可视化逻辑函数转换(真值表/卡诺图/波形图一键生成)
  • 竞赛回忆录
  • Tasmota设备与本地MQTT服务器双向通信实战:从订阅主题到控制设备
  • Logisim实战:手把手教你搞定16位海明码电路,附头歌平台避坑指南
  • HRNet实战:如何用PyTorch复现关键模块并可视化网络结构(附完整代码)
  • 3个核心功能+5步实战:PvZ Toolkit让你重新定义植物大战僵尸体验
  • Skillpilot:一键集成AI编码技能,提升开发效率与代码安全
  • PHP 8.9命名空间隔离:SaaS多租户架构最后1公里——如何用静态分析工具提前拦截99.6%的跨租户符号泄漏?
  • Floccus插件配置踩坑实录:从WebDAV密码错误到书签目录冲突,一篇讲清所有常见问题
  • 桑拿房厂家口碑排行榜单 - 速递信息
  • Zynq PS串口不够用?手把手教你用Vivado在PL侧扩展8路UARTLite(附环路测试技巧)
  • FileBrowser配置太复杂?一份JSON配置文件搞定所有,附详细参数解读
  • Windows 10终极系统优化指南:用Win10BloatRemover让你的电脑飞起来!
  • FreeRTOS heap4内存管理源码逐行解读:从链表操作到内存碎片合并
  • 分钟Mac本地跑通B wen!免费GPT-o替代,还能分钟造个会开浏览器+执行Shell的AI Agent
  • 思源宋体CN终极指南:7种免费商用字体快速上手技巧
  • 2026.4.29.C2