码迷,mamicode.com
首页 > 编程语言 > 详细

jvm学习-java代码是怎么运行的

时间:2018-07-20 16:49:30      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:strong   分布   内存   加载   http   优势   混合   问题   jre   

首先一个问题入题:是否知道java和c++在运行方式上的区别?

java需要依赖JRE的运行环境,而c++代码则无需额外的运行时。

那么问题又来了,既然c++的运行方式已经很成熟了,那么为什么java要在虚拟机中运行呢?

  1. 为了实现一次编写,到处运行的目标。
  2. jvm作为一个很好的托管环境,能够代替我们处理一些代码中冗长而且容易出错的部分,比如垃圾回收。

java虚拟机具体是怎样运行java字节码的?

从虚拟机的视角来看,执行java代码首先需要将它编译而成的class文件加载到java虚拟机中。加载后的java类会被存放在方法区中。实际运行时,虚拟机会执行方法区的代码。

技术分享图片

在运行过程中,每当调用进入一个java方法,java虚拟机会在当前线程的java方法栈中生成一个栈帧,用以存放局部变量以及字节码的操作数。这个栈帧的大小是提前计算好的,而且java虚拟机不要求栈帧在内存空间里连续分布。

在hotspot里面,上述翻译过程有两种形式:第一种是解释执行,即逐条将字节码翻译成机器码并执行;第二种是即时编译(JIT),即将一个方法包含的所有字节码编译成机器码后再执行。

技术分享图片

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

java虚拟机的运行效率究竟怎么样?

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

对于占据大部分的不常用的代码,我们无需好分时间将其编译成机器码,而是采用解释执行的方式运行;另一方面,对于仅占据小部分的热点代码,我们则可以将其编译为机器码,以达到理想的运行速度。

理论上讲,即时编译后的java程序的执行效率,是可能超过c++的。这是因为与静态编译相比,即时编译拥有程序的运行时信息,并且能够根据这个信息做出相应的优化。举个栗子:对于一个虚方法的调用,尽管有很多个目标方法,但在实际运行过程中他可能只调用其中一个。这个信息可以被即时编译器所利用,来规避虚方法调用的开销。

jvm学习-java代码是怎么运行的

标签:strong   分布   内存   加载   http   优势   混合   问题   jre   

原文地址:https://www.cnblogs.com/xxxuwentao/p/9341969.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!