1999年,sun公司开发出基于c/c++的java虚拟机HotSpot。2006年,开源了相关技术,启动了openjdk项目。2008年jrockit并入HotSpot。2010年,sun公司被oracle公司收购。目前HotSpot虚拟机技术是主流的的,采用了解释和编译混合执行模式,其中JIT技术采用分层编译,提升了java的执行速度。

1.为什么java要在虚拟机中运行

相信用过Java的人都听过java ‘一次编译到处执行’ 的宣传口号。我们知道所有的应用都需编译成相应的底层机器码,类似c、c++编程的应用 需要在本地编译后才可以转成适应本地机器的机器码来运行;而因为java虚拟机的存在,java语言就可以用java字节码[1]的形式在虚拟机中运行应用,JVM可以由硬件实现也可以在各平台提供软件实现,就不用关心移植性等问题;
另一方面通过JVM,我们可以在程序外进行垃圾处理调优,动态检测(数组越界、动态类型)等必需的功能。

2.本质及优点

学习JVM的本质是了解java程序是如何被执行优化的过程;
JVM拥有当前最前沿、成熟的垃圾回收算法以及及时编译器的实现;
学习JVM可以更好规避在使用过程中的bug和错误。

3.发展进程

JVM至今的发展已经脱离的java语言,除了java语言外还有Scala、Clojure、Groovy、Kotlin等都是运行在JVM上的。

4.java环境

java有两个环境,一个是运行时环境JRE,一个开发环境JDK。JRE中只包含JVM和java的核心类库,而JDK除了包含JRE外还有很多相关开发、诊断的工具。

5.那么JVM是怎么样运行java字节码的呢??(单从软硬件两方面而言)

  • 以HotSpot虚拟机为例,从两个方面出发

    从虚拟机角度:java代码首先需要编译成java字节码后再加载到虚拟机中,加载后的java字节码会存放在方法区中。JVM会在内存中划分出、栈来存储运行时数据,将栈细分为面向java方法的java方法栈,面向本地方法(用c++写的native方法)的本地方法栈,以及存放各个线程执行位置的的PC寄存器
    在实际运行时,虚拟机会执行方法区的代码,每次调用进入一个java方法,虚拟机都会在当前线程的java方法栈中生成一个栈帧,用来保存局部变量和字节码的操作数,当退出当前执行方法时,虚拟机就会弹出并丢弃当前线程的栈帧。

  • 以硬件角度出发

    java字节码无法直接执行,需要虚拟机编译成机器码。在HotSpot中有两种编译方式:解释执行(逐条将字节码编译成机器码并执行)和即时编译(将方法包含的所有方法都编译成机器码后再执行)。
    解释执行的优点在于无需等待编译,而即时编译的实际运行速度更快,HotSpot采用的是混合模式,综合两个编译器的优点,先解释执行字节码,再将其中反复执行的热点代码以方法为单位进行即时编译

jvm运行字节码 -- 图片5M有点大yo

To be continued!

[1]:Java 字节码指令的操作码(opcode)被固定为一个字节,所以取名字节码。