vlambda博客
学习文章列表

Java虚拟机解析(一)

作为一名java程序员,你应该知道,java代码有很多不同运行方式,比如在开发工具中运行,可以双击jar文件运行,也可以命令行中运行,甚至可以在网页中运行,当然这些运行方式都离不开JRE,也就是java的运行时环境。


实际上,JRE仅包含了运行java程序的必须组件,包含了java虚拟机以及java核心类库等。我们java程序员经常接触到的JDK(java开发工具包)同样包含了JRE,并且附带了一系列的开发诊断工具。


为什么java程序要在java虚拟机中运行

java作为一门高级的编程语言,它的语法非常复杂,抽象程序也很高。。所以直接在硬件上运行这样复杂的程序不现实,所以运行java程序之前一定要多它做一番转换。


转换的主要思路:设计一个面向java程序特性的虚拟机,并通过编译器将程序转化成虚拟机可以识别的指令序列,也称为java字节码。


java虚拟机怎样运行java字节码?

下明从标准JDK中HotSpot虚拟机为例,从虚拟机以及底层硬件的角度介绍java虚拟机如何运行java字节码。


从虚拟机的角度发,执行java代码首先需要将它编译的class文件加载到java虚拟机中,加载后的java代码会被存放于方法区中,实际运行时,虚拟机会执行方法区中的代码。j


java虚拟机在内存中划分出堆以及栈用于存放运行时数据,同时java虚拟机会将栈划分为面向java方法的java方法栈以及面向本地方法(c++编写的native方法)的本地方法栈,以及存放各个线程执行位置的PC寄存器。







在运行的过程中,每当调用一个java方法,java虚拟机就会在当前线程的java方法栈中生成一个栈帧。这个栈帧是提前算好的,而且java虚拟机不要求栈帧在内存中连续分布。


当退出当前的方法执行时,不论是正常返回还是异常返回,java虚拟机都会弹出当前线程的当前栈帧,并将之舍弃。


从硬件的角度来看,java字节码是无法运行地1,因此,java虚拟机需要将字节码翻译成机器码。


在HotSpot里面,上述的翻译·过程有俩种方式:一种是解释执行,即逐条将字节码编译成机器码并执行;第二种是即时编译(Just-In-Time Compilation),即将一个方法中包含的所有字节码全部编译完之后再执行。



前者的优势在于需要等待编译,而后者的优势在于实际的执行速度更快。HotSpot采用了混合模式,综合了解释执行以及即时编译的优点,先解释执行字节码,而后将其中反复执行的代码,以方法为单位进行即使编译。


java虚拟机的运行效率

HotSpot采用了多种技术来提升启动性能以及峰值性能,即时编译就是其中的重要技术之一。


即时编译是建立在程序符合二八定律的假设上的,即百分之二十的代码占据了百分之八十的计算资源。


对于占据了大部分的不常用的代码,我们不需要耗费时间将它编译成机器码,而是采用执行的方式,另一方面,对于占据一小部分的热点代码,我们可以将它编译成机器码,达到理想的运行速度。


总结:

简单介绍了java代码如何在java虚拟机中执行

JVM如何执行java字节码