我们都知道要运行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编译质量更高.

Java代码如何运行在Java虚拟机中相关推荐

  1. java代码如何运行?

    前言 作为一名Java程序员,我们需要知道Java代码是怎么运行的.最近复习了深入理解Java虚拟机,做了一下总结,希望对大家有帮助,如果有不正确的地方,欢迎提出,感激不尽. java 代码运行主要流 ...

  2. 【Java 虚拟机原理】JDK 体系结构 | Java 源码运行原理 | Java 虚拟机内存

    文章目录 一.JDK 体系结构 二.Java 源码运行原理 三.Java 虚拟机内存结构 一.JDK 体系结构 JDK 体系结构 : 下图所有的内容都是 JDK 体系中的组成元素 ; Java Lan ...

  3. java main函数_一行JAVA代码如何运行起来?

    在程序员的世界中,你总会听到一句"PHP是世界上最好的语言"的调侃.然而在你进入软件程序开发之后,你会发现即使开发语言千千万,最盛行的还是JAVA.从淘宝的技术变迁中我们可以见一些 ...

  4. 【Java 代码实例 13】Java操作pdf的工具类itext

    目录 一.什么是iText? 二.引入jar 1.项目要使用iText,必须引入jar包 2.输出中文,还要引入下面```itext-asian.jar```包 3.设置pdf文件密码,还要引入下面` ...

  5. 怎么运行java虚拟机_Java代码如何运行在Java虚拟机中

    我们都知道要运行Java代码就必须要有JRE,也就是Java运行时环境,JRE中包含了Java程序的必需组件,包括Java虚拟机以及Java核心类库,然而运行C++代码则不需要额外的运行时环境,只需要 ...

  6. 循环队列真的没那么难,就那么几个注意点,附Java代码及运行效果

    1. 队列 队列是一种常见的线性数据结构,满足先进先出(First In First Out),简称为FIFO,第一次看到FIFO还以为是单片机的输出输出什么的,见笑了.数据结构不太了解的话可以看看我 ...

  7. Java代码如何运行的?

    前言 Java不同于C.C++,运行C++时只需将源代码编译成CPU所能理解的机器码即可.然而,Java需要在Java虚拟机中运行,将Java源代码编译成虚拟机能识别的字节码(即.class文件). ...

  8. 【剧前爆米花--爪哇岛寻宝】初识Java,了解Java代码的运行机制及JDK,JRE,JVM等

    作者:困了电视剧 专栏:<JavaSE语法与底层详解> 文章分布:这是一篇知识点较为基础的文章,我会先将JavaSE相关的知识给罗列一遍,然后在后续的文章中会对其中重要的点再逐一进行底层剖 ...

  9. 【 史上最坑爹的Java代码系列02 】Java中的三种代码块

    Java中有三种代码块,三种代码块中的代码执行的优先级是面试中会被提问到的问题. 三种代码块:静态代码块.方法代码块.普通代码块 其中,普通代码块是比较少见而且比较少使用的. package com. ...

  10. java代码识别_识别Java中的代码气味

    java代码识别 作为软件开发人员,我们不仅要编写有效的代码,而且还要编写可维护的代码,这是我们的责任. Martin Fowler在他的<重构:改进现有代码的设计>中将代码气味定义为: ...

最新文章

  1. linux系统管理学习笔记之三----软件的安装
  2. Windows 2003 + ISA 2006+单网卡×××配置(4)
  3. 我们需要怎样的人工智能基础教育
  4. 机器人日行十万步却无需动力源!究竟如何完美的机械结构让你开始怀疑人身...
  5. JEPaas代码———出库数量,添加明细, 确认出库
  6. java二次方程式答案_二次方程式Java?
  7. 【渝粤教育】国家开放大学2018年春季 0092-22T民法 参考试题
  8. PHP截取文件,[转载]php做截取文件后缀名大全
  9. linux2.6.34编译安装,ubuntu 10.04 编译安装最新版本linux-2.6.34内核
  10. php代码给用户安装浏览器,PHP判断用户浏览器是否安装alexa工具条程序
  11. chrome常用插件-前端-后端-产品 集合推荐
  12. 域名解析TTL是什么意思 TTL值设置为多少合适?
  13. 大数据热点案例(含图)
  14. VUE项目学习(三):win10版nginx部署vue项目
  15. 《ANSYS 14.0超级学习手册》一1.1 有限元法概述
  16. 关于在vscode引入python中Crypto包的问题
  17. 七年级计算机基本结构,七年级信息技术计算机基本组成和工作原理
  18. 百度地图爬虫——小试牛刀
  19. 日本机器自动化初创企业Cinnamon获天使轮融资
  20. SiC功率半导体产业高峰论坛成功举办

热门文章

  1. 一张图看透办公网安全
  2. GoDaddy Linux主机支持机房的更换
  3. 如何用C#+WinRAR 实现压缩 分类:
  4. Linux -- sudoers (简单:转)
  5. EVENT ADJUST_SCN 说明 [30681.1]
  6. 若何设定Linux把持系统的启动暗码
  7. MSP430学习笔记10-ADC采集1602显示
  8. Shelld5的使用
  9. kafka c++客户端编译
  10. 【CAD】自定义实体的步骤(转)