Java代码如何运行在Java虚拟机中

栏目: Java · 发布时间: 5年前

内容简介:我们都知道要运行Java代码就必须要有JRE,也就是Java运行时环境,JRE中包含了Java程序的必需组件,包括Java虚拟机以及Java核心类库,然而运行C++代码则不需要额外的运行时环境,只需要把代码编译成CPU能识别的指令即可,也就是机器码.那为什么Java不直接像C++那样而需要在虚拟机中运行呢?他在虚拟机中又是如何运行的?接着往下看.刚才我们谈到C++是直接把代码编译成机器码的,但因为各个平台的架构不一样,CPU能处理的指令集也不一样,所以如果要在另一个平台上运行C++代码,就必须用该平台对应的

我们都知道要运行 Java 代码就必须要有JRE,也就是Java运行时环境,JRE中包含了Java程序的必需组件,包括Java虚拟机以及Java核心类库,然而运行C++代码则不需要额外的运行时环境,只需要把代码编译成CPU能识别的指令即可,也就是机器码.那为什么Java不直接像C++那样而需要在虚拟机中运行呢?他在虚拟机中又是如何运行的?接着往下看.

Java为什么要在虚拟机中运行

刚才我们谈到C++是直接把代码编译成机器码的,但因为各个平台的架构不一样,CPU能处理的指令集也不一样,所以如果要在另一个平台上运行C++代码,就必须用该平台对应的C++代码编译器重新编译一遍才可以.Java一开始就意识到需要跨平台运行,所以Java设计了虚拟机,先将Java代码编译成字节码(class文件),这是虚拟机能够识别的指令,再由虚拟机内部将字节码翻译成机器码,所以我们只需要有Java字节码,就可以在不同平台的虚拟机中运行,这也就是我们一直说的"一次编译,到处运行".

Java虚拟机如何运行Java字节码

我们JDK所用的虚拟机名为HotSpot虚拟机,他会将所有class文件加载进来,加载后的Java类会被放置在方法区,后面运行时会执行其中的代码.Java虚拟机会在内存中划分出几块,包括程序计数器,本地方法栈,Java虚拟机栈,堆以及方法区.

不过光是Java字节码还是无法运行,Java虚拟机还需要将字节码翻译成机器码,HotSpot有2种形式:第一种是解释执行,即将字节码逐条翻译成机器码并运行;第二种是即时编译(JIT),他会将一个方法内的所有字节码编译成机器码再执行.

Java代码如何运行在Java虚拟机中

前者的优势无需等待编译,但逐条解释的代价就是运行速度会比后者慢,HotSpot默认采用混合模式,它会先解释执行字节码,然后对于反复执行的热点代码会去进行即时编译.

即时编译是监理在复合二八定律的基础上,即百分之20的代码占据百分之80的计算资源.对于不常用的代码我们无需消耗时间在编译成机器码上,采用解释执行就可以,而对于热点代码我们可以将其编译成机器码以提升运行速度.

HotSpot内置了几个即时编译器:Client Complier和Server Complier,简称为C1、C2编译器,以便在编译时间和生成代码的执行效率之间做取舍,C1编译时间更快,C2编译质量更高.


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web Development Recipes

Web Development Recipes

Brian P. Hogan、Chris Warren、Mike Weber、Chris Johnson、Aaron Godin / Pragmatic Bookshelf / 2012-1-22 / USD 35.00

You'll see a full spectrum of cutting-edge web development techniques, from UI and eye candy recipes to solutions for data analysis, testing, and web hosting. Make buttons and content stand out with s......一起来看看 《Web Development Recipes》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码