资讯专栏INFORMATION COLUMN

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

whjin / 2050人阅读

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

我们都知道要运行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),他会将一个方法内的所有字节码编译成机器码再执行.

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

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73290.html

相关文章

  • 深入理解Java虚拟机到底是什么

    摘要:由虚拟机加载的类,被加载到虚拟机内存中之后,虚拟机会读取并执行它里面存在的字节码指令。虚拟机中执行字节码指令的部分叫做执行引擎。 什么是Java虚拟机? 作为一个Java程序员,我们每天都在写Java代码,我们写的代码都是在一个叫做Java虚拟机的东西上执行的。但是如果要问什么是虚拟机,恐怕很多人就会模棱两可了。在本文中,我会写下我对虚拟机的理解。因为能力所限,可能有些地方描述的不够欠...

    宋华 评论0 收藏0
  • Java虚拟机中,字符串常量到底存放

    摘要:的三种常量池此外,有三种常量池,即字符串常量池又叫全局字符串池文件常量池运行时常量池。开始虚拟机把字符串常量池位置从永久代挪到堆,又彻底取消,把诸如之类的元数据都挪到堆之外管理。 前言 前阵子和朋友讨论一个问题: 字符串常量归常量池管理,那比如 String str = abc; abc这个对象是放在内存中的哪个位置,是字符串常量池中还是堆? 这句代码的abc当然在常量池中,只有n...

    lewinlee 评论0 收藏0
  • 《深入理解java虚拟机》学习笔记系列——对象的内存布局

    摘要:上一篇文章讲解了虚拟机中的内存布局,这里就稍作拓展,聊聊对象在虚拟机中的一些存储细节吧。参考文档深入理解虚拟机高级特效与最佳实现,第章周志明著系列笔记内存区域和机制明舞深入理解结构团长联系作者 上一篇文章讲解了 java 虚拟机中的内存布局,这里就稍作拓展,聊聊 java 对象在虚拟机中的一些存储细节吧。 本文主要围绕虚拟机中对象如何创建?对象内存都放些什么?如何访问对象内存?这么三...

    miya 评论0 收藏0
  • 深度理解JVM-----运行时数据区域

    摘要:在之后,原来永久代的数据被分到了堆和元空间中。元空间存储类的元信息,静态变量和常量池等放入堆中。这样能在一些场景中显著提高性能,因为避免了在堆内存和堆外内存来回拷贝数据。 以下内容部分转载于: CS-Notes showImg(http://ww1.sinaimg.cn/large/005NT19Ply1g385uooqv9j30kd0slmyw.jpg); 程序计数器(Program...

    tuantuan 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<