75W阿⾥架构师分享深⼊解析Java虚拟机HotSpot⽂档Java语⾔已经⾛过了20多个年头,在此期间虽然新语⾔层出不穷,但是都没有撼动Java的位置。可能是历史选择了Java,也可能是Java改变了历史,总之,Java⽆疑是
⼀门成功的编程语⾔。这门语⾔之所以能如此成功,⾼性能语⾔虚拟机HotSpot功不可没。
客观地说,HotSpot VM是⽬前顶级的语⾔虚拟机之⼀,它的模板解释器是语⾔解释器的最终状态,除⾮有重⼤技术突破和⽅法论的改变,否则很难被超越。它的垃圾回收器也⽇臻完善,新的⽆停顿GC的出现标志着JVM正在迈向GC顶级俱乐部。它的即时编译器是权衡编译开销与应⽤吞吐量后得到的⼀个卓越且精湛的艺术品。
本⽂既考虑到内容的⼴度也关注了技术的深度,详细描述了虚拟机的底层实现,并与上层Java语⾔或者库结合,以实⽤为⽬标展开介绍,同时还讨论了它们的深刻意义。
从内容⼴度的⾓度看,本⽂除了讨论⽿熟能详的Java虚拟机技术外,还详细讨论了业界最新的通⽤虚拟机平台Graal VM、
CDS/AppCDS/DynamicCDS、Instrumentation库、编译重放、⾮标准字节码、栈上替换,RTM锁、JIT编译器IR、JIT编译器可视化⼯具、编译逃离、EpsilonGC/ShenandoahGC/ZGC、G1字符串去重等技术。
从内容深度的⾓度看,本⽂详细讨论了:
G1 GC的回收策略和底层代码实现;
C1编译器的HIR和LIR,以及针对不同IR上应⽤的优化;
C2编译器的Ideal Graph以及平台⽆关的优化技术;
CPU重排序与ObjectMonitor、Mutex的底层实现;
模板解释器的代码⽚段⽣成逻辑和字节码模板⽣成逻辑;
⽬录
主要内容
本⽂共11章,全⽂从逻辑上可分为运⾏时、编译器、垃圾回收器三个部分。
第⼀部分(第1~6章),介绍Java虚拟机运⾏时的相关知识;
第1章Java⼤观园;作为本书的开篇,本章将围绕Java的⽣态系统,简单介绍JDK、JVM、JEP,引导读者⾛进虚拟机的世界。
1.1节介绍了各具特⾊的JDK分⽀和OpenJDK的⼦项⽬。1.2节介绍了Java改进提案,它们代表类Java社区最新的⼯作动向。1.3节简单描述了历史长河中存在或者曾经存在的Java虚拟机。1.4节讨论了HotSpotVM的组件、源码结构、构建、调试以及修改代码后如何回归测试。最后1.5节展望未来,讨论了Java的前沿技术Graal VM。
第2章类可⽤机制;⼀个类需要经过漫长的旅程才能被虚拟机其他组件,如解释器、编译器、GC等在运⾏时使⽤,下⾯将详细介绍类的⼀个完整⽣命周期,即加载、链接、初始化三部曲。
本章从2.1节开始,介绍了位于磁盘的⼆进制表⽰的字节码被类⽂件解析器加载并解析,得到虚拟机内部⽤于表⽰类的InstanceKlass数据结构。为了保证字节码是安全可靠的,在2.2节链接阶段,⾸先验证了字节码的结构正确性;出于性能考虑,链接阶段还可能调⽤重写器将⼀些字节码替换为⾼性能的版本,加快后⾯的解释执⾏;链接阶段的核⼼⼯作是设置编译器/解释器⼊⼝以便后续代码能够正常执⾏,同时为了保障后续解释/编译模式的切换,还会设置适配器来消除两种模式之间的沟壑。接着,根据《Java虚拟机规范》中赋予类初始化的语义,在2.3节介绍了初始化阶段同时执⾏⽤户的静态代码块和隐式静态字段初始化。最后2.4节特别讨论了类的重定义。
第3章对象和类;本章讨论Java对象和类在HotSpot VM内部的具体实现,探索虚拟机在底层是如何对这些Java语⾔的概念建模的。
本章主要围绕对象和类的相关内容展开。3.1节介绍了HotSpot VM中对象和类的设计原则。3.2节介绍了对象和类模型,它们在JVM层表⽰Java层的对象。3.3节介绍了类模型,它们在JVM层表⽰Java层的Class<?>。对象和类共同构成对象类⼆分模型,是HotSpot VM的核⼼数据结构。
第4章运⾏时;运⾏时,顾名思义是指虚拟机运⾏的时候,它表征程序执⾏时的状态,本章将讨论虚拟机运⾏时涉及的⽅⽅⾯⾯。
4.1节讨论了JVM中五花⼋门的线程以及它们的作⽤。4.2节从源码⾓度分析线程API的实现,同时扩展分析线程API实现时涉及的其他重要模块如JavaCalls、os,并简单提及ParkEvent、Parker、OrderAccess组件。4.3节讨论了线程栈帧的实现。4.4节讨论虚拟机层的代码如何与Java层的代码交互,以此引出JNI和JavaCalls模块。4.5节讨论JDK中的Unsafe类,并给出它在虚拟机的具体实现。
第5章模板解释器;最简单的Java虚拟机可以只包括类加载器和解释器:类加载器加载字节码iconst_1、iconst_1、iadd并传给虚拟机,解释器按照字节码计算并得到结果。在没有JIT编译器的情况下,解释器从某种程度上来说就是虚拟机本体,有关虚拟机的绝⼤部分问题都能在解释器中到答案。本章将详细讨论解释器的内部构造和解释执⾏过程。
本章讨论了HotSpot VM中最重要组件之⼀——解释器的构成和⼯作机制。5.1节讨论解释器的源码结构和构成解释器的基础设施;5.2节讨论了构成解释器的元素;5.3节和5.4节描述了解释器与其他虚拟机组件的合作⽅式;5.5节详细讨论了解释器实现,包括解释器如何执⾏
普通Java⽅法和native⽅法、标准字节码是如何实现的,以及⾮标准字节码是如何实现的。
第6章并发设施;并发是Java的⼀⼤特⾊,通过并发,可以在Java层实现多个线程协同⼯作或者互斥执⾏。上层应⽤的易⽤性、安全性、⾼效性都是由HotSpot VM中的并发设施来保证的。并发设施是HotSpot VM中相当复杂的组件,本章将简单讨论虚拟机在并发⽅⾯付出的努⼒。
6.1节介绍了重排序和内存屏障,它们是Java内存模型的基础。6.2节简单介绍了Java内存模型,它在程序的⼀些特定的地⽅设置内存屏
java类的概念障,禁⽌指令重排序的发⽣,使程序顺序和执⾏顺序保持⼀致。6.3节介绍了虚拟机内部并发基础设施,包括原⼦操作、ParkEvent、
Parker、Monitor,它们⼴泛⽤于虚拟机内部的各种需要同步的地⽅。6.4节介绍了更⾼层次的基于并发继承设施的锁优化策略。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论