最近在差不多看完JVM和并发的书籍以及顺便用幕布做了点笔记基础上,认为是时候总结一下JVM部分学习到的知识。
参考书籍主要是:《深入理解Java虚拟机》第三版。还有很多视频课程(主要是宋红康老师的视频教程)、系列博客也对我学习JVM带来了很多帮助。
所以才有了这一系列关于JVM学习的文章。
下面正式开始。
什么是Java虚拟机
首先我们要明白什么是Java虚拟机,Java虚拟机(JVM)就是二进制字节码的运行环境,负责装载字节码文件到其内部,解释/编译为对应平台的机器指令执行。Java是跨平台的语音,Java虚拟机是保证了Java能跨语音的平台。JVM有如下作用:(1)一次编写,到处运行。(2)自动内存管理。(3)自动垃圾回收功能。
先来看下图,这是Java技术体系图,可以看到底层是JVM,JVM是字节码运行的环境,但是光有环境是不能运行Java代码的;JRE是Java运行环境,它包含了JVM标准实现及Java核心类库;我们平时写代码是需要在JDK,或者在各种IDE上编写代码
Java虚拟机运行时数据区
上面初步了解了JVM,接下来我们来看一下Java虚拟机内部的运行时数据区
如上图,主要有堆、方法区、虚拟机栈、本地方法栈、程序计数器,后三者是线程私有,前两者是所有线程共享的内存区域。
下图具有更多的细节
Java代码经过编译器编译成字节码文件,然后经过类加载子系统,经过类加载机制(包括:加载、连接【验证、准备、解析】、初始化阶段)加载入JVM内存区域,经过执行引擎和本地方法库接口运行代码。在运行时数据区部分,对于线程私有的虚拟机栈其中还有可细化的部分,每一个方法对应着一个栈帧,每一个栈帧又包含局部变量表、操作数栈、动态连接、方法返回地址和附加信息。执行引擎部分还有字节码的解释器、JIT即时编译器、垃圾回收。
以上内容都会在后续的文章中具体讲解。
Java虚拟机家族
Classic VM:第一款商用Java虚拟机,纯解释器,可以使用外挂JIT编译器,但二者在同一时间只有一个能使用。
Exact VM:具备现代高性能虚拟机雏形,包括热点探测、两级即时编译器、编译器和解释器混合工作模式等。
HotSpot VM
在《深入理解Java虚拟机》一书中,对HotSpot的形容是武林盟主,现在也是使用最广泛的Java虚拟机。HotSpot虚拟机的热点代码探测能力可以通过执行计数器找出最具有编译价值的代码,然后通知即时编译器以方法为单位进行编译。如果一个方法被频繁调用或方法中有效循环次数很多,将会分别触发即时编译和栈上替换编译行为。通过编译器与解释器恰当地协同工作,可以在最优化的程序响应时间与最佳执行性能中取得平衡,而且无须等待本地代码输出才能执行程序,即时编译的时间压力也相对减少,这样有助于引入更复杂的代码优化技术,输出质量更高的本地代码。
BEA JRockit VM:纯即时编译器,应用于服务器硬件和环境,号称最快的JVM。
IBM J9 VM:配合IBM的产品使用效果很好,类似HotSpot。
BEA Liquid VM:在BEA自家系统上使用效果很好,但随着JRockit终止开发,这个也停止了。
Azul VM:Azul公司在HotSpot的基础上进行开发,在Azul公司专有的Vega系统上运行效果极佳,后转向Zing虚拟机。
Dalvik VM:安卓的虚拟机,即时编译,但后来出了使用提前编译的ART直接把Dalvik按在地上摩擦。
Graal VM:无语言倾向的虚拟机,可以将多种语言的源代码通过解释器转换为能被GraalVM接受的中间表示,被认为是最可能替代HotSpot的虚拟机。
参考资料:
《深入理解Java虚拟机》
图源自网络,侵删。