文章目录
1. 虚拟机与Java虚拟机所谓虚拟机(Virtual Machine),就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟的计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。 》 我们常用的Mware,Visual Box就属于系统虚拟机,它们完全是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。 》 程序虚拟机的典型代表就是Java虚拟机。他专门为执行单个计算机程序而设计,在Java虚拟机中执行的指令我们称之为Java字节码指令。 无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中。
Java虚拟机时一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成。 JVM平台的各种语言可以共享Java虚拟机带来的跨平台性、优秀的垃圾回收器、以及可靠的即时编译器。 Java技术的核心就是Java虚拟机(JVM,Java virtual machine),因为所有的Java程序都运行在Java虚拟机内部。 Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里 。 特点:
2. JVM的位置JVM是运行在操作系统之上的,它与硬件没有直接的交互。 3. Java的体系结构4. JVM整体结构5. Java代码执行流程6. JVM的架构模型Java编译器输入的指令流基本上是一种基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构。两种架构之间的区别为: 基于栈时架构的特点: 基于寄存器架构的特点:
举例: 同样执行2 3这种逻辑操作,其指令分别如下: 基于栈的技术流程(以Java虚拟机为例):
iconst_2 //常量2入栈
istore_1
iconst_3 // 常量3入栈
istore_2
iload_1
iload_2
iadd //常量2/3出栈,执行相加
istore_0 // 结果5入栈 而基于寄存器的计算流程: mov eax,2 //将eax寄存器的值设为1
add eax,3 //使eax寄存器的值加3 字节码反编译 编写一个简单的代码,然后查看一下字节码的反编译后的结果: public class StackStruTest {public static void main(String[] args) {int i = 2 3;
}
} 然后找到编译后的 class文件,使用下列命令进行反编译: javap -v StackStruTest.class 得到的文件为:
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=4, args_size=1
0: iconst_2
1: istore_1
2: iconst_3
3: istore_2
4: iload_1
5: iload_2
6: iadd
7: istore_3
8: return
LineNumberTable:
line 9: 0
line 10: 2
line 11: 4
line 12: 8
LocalVariableTable:
Start Length Slot Name Signature
0 9 0 args [Ljava/lang/String;
2 7 1 i I
4 5 2 j I
8 1 3 k I 小结 由于跨平台的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现。缺点是性能下降,实现同样的功能需要更多的指令。
栈
7. JVM生命周期虚拟机的启动 Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成,这个类由虚拟机的具体实现指定的。
虚拟机的执行 虚拟机的退出 有如下的几种情况:
8. JVM发展历程Sun Classic VM早在1996年Java1.0版本的时候,Sun公司发布了一款名为sun classic VM的Java虚拟机,它同时也是世界上第一款商用Java虚拟机,JDK1.4时完全被淘汰。 这款虚拟机内部只提供解释器。没有即时编译器,因此效率比较低,而即时编译器会把热点代码缓存起来,那么以后使用热点代码的时候,效率就比较高。 如果使用JIT编译器,就需要进行外挂。但是一旦使用了JIT编译器,JIT就会接管虚拟机的执行系统。解释器就不再工作。解释器和编译器不能配合工作。 现在Hotspot内置了此虚拟机。
HotSpot VM目前Hotspot占有绝对的市场地位,称霸武林。 名称中的HotSpot指的就是它的热点代码探测技术。
JRockit专注于服务器端应用 大量的行业基准测试显示,JRockit JVM是世界上最快的JVM。 优势:全面的Java运行时解决方案组合 2008年,JRockit被oracle收购。
IBM的J9市场定位与HotSpot接近,服务器端、桌面应用、嵌入式等多用途VM广泛用于IBM的各种Java产品。 目前,有影响力的三大商用虚拟机之一,也号称是世界上最快的Java虚拟机。 2017年左右,IBM发布了开源J9VM,命名为openJ9,交给EClipse基金会管理,也称为Eclipse OpenJ9
Azul VM和Liquid VMTaobao JVM由AliJVM团队发布。是基于openJDK开发了自己的定制版本AlibabaJDK,简称AJDK。是整个阿里Java体系的基石。 基于openJDK Hotspot VM发布的国内第一个优化、深度定制且开源的高性能服务版Java虚拟机。 创新的GCIH(GCinvisible heap)技术实现了off-heap,即将生命周期较长的Java对象从heap中移到heap之外,并且Gc不能管理GCIH内部的Java对象,以此达到降低GC的回收频率和提升Gc的回收效率的目的。 GCIH中的对象还能够在多个Java虚拟机进程中实现共享。 使用crc32指令实现JVM intrinsic降低JNI的调用开销。 PMU hardware的Java profiling tool和诊断协助功能。 针对大数据场景的ZenGc。
taobao vm应用在阿里产品上性能高,硬件严重依赖intel的cpu,损失了兼容性,但提高了性能。目前已经在淘宝、天猫上线,把oracle官方JvM版本全部替换了。
Dalvik VM谷歌开发的,应用于Android系统,并在Android2.2中提供了JIT,发展迅猛。 Dalvik只能称作虚拟机,而不能称作“Java虚拟机”,它没有遵循 Java虚拟机规范。 不能直接执行Java的Class文件 基于寄存器架构,不是jvm的栈架构。 执行的是编译以后的dex(Dalvik Executable)文件,执行效率比较高。 Android 5.0使用支持提前编译(Ahead of Time Compilation,AoT)的ART VM替换Dalvik VM。
Graal VM2018年4月,oracle Labs公开了Graal VM,号称 “Run Programs Faster Anywhere”。 Graal VM在HotSpot VM基础上增强而成的跨语言全栈虚拟机,可以作为“任何语言” 的运行平台使用。语言包括:Java、Scala、Groovy、Kotlin;C、C 、Javascript、Ruby、Python、R等。 工作原理是将这些语言的源代码或源代码编译后的中间格式,通过解释器转换为能被Graal VM接受的中间表示。Graal VM提供Truffle工具集快速构建面向一种新语言的解释器。在运行时还能进行即时编译优化,获得比原生编译器更优秀的执行效率。 如果说HotSpot有一天真的被取代,Graal vm希望最大。但是Java的软件生态没有丝毫变化。 .
总结具体JVM的内存结构,其实取决于其实现,不同厂商的JVM,或者同一厂商发布的不同版本,都有可能存在一定差异。主要以oracle HotSpot VM为默认虚拟机。
|