专栏首页WindCoderJVM-Java代码运行方式

JVM-Java代码运行方式

  • JRE(Java 运行时环境)仅包含运行 Java 程序的必需组件,包括 Java 虚拟机以及 Java 核心类库等。
  • JDK(Java 开发工具包)同样包含了 JRE,并且还附带了一系列开发、诊断工具。

为了能运行Java,当前的主流思路是设计一个面向 Java 语言特性的虚拟机,并通过编译器将 Java 程序转换成该虚拟机所能识别的指令序列,也称 Java 字节码。之所以这么取名,是因为 Java 字节码指令的操作码(opcode)被固定为一个字节。

Java 虚拟机可以由硬件实现 [1],但更为常见的是在各个现有平台(如 Windows_x64、Linux_aarch64)上提供软件实现。

C++的策略是直接编译成目标架构的机器码,Java的策略是编译成一个虚拟架构的机器码。

使用JVM的好处

一旦一个程序被转换成 Java 字节码,那么它便可以在不同平台上的虚拟机实现里运行。即 “一次编写,到处运行”

JVM带来了一个托管环境(Managed Runtime)。这个托管环境提供了自动内存管理与垃圾回收,以及诸如数组越界、动态类型、安全权限等等的动态检测,使我们免于书写这些无关业务逻辑的代码。

JVM运行Java字节码

虚拟机视角

执行 Java 代码首先需要将它编译而成的 class 文件加载到 Java 虚拟机中。加载后的 Java 类会被存放于方法区(Method Area)中。实际运行时,虚拟机会执行方法区内的代码。

Java 虚拟机在内存中划分出堆和栈来存储运行时数据。

Java 虚拟机会将栈细分为面向 Java 方法的 Java 方法栈,面向本地方法(用 C++ 写的 native 方法)的本地方法栈,以及存放各个线程执行位置的 PC 寄存器。

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

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

硬件视角

Java 字节码无法直接执行,因此,Java 虚拟机需要将字节码翻译成机器码。

在 HotSpot 里面,翻译过程有两种形式:

  • 第一种是解释执行,即逐条将字节码翻译成机器码并执行;
  • 第二种是即时编译(Just-In-Time compilation,JIT),即将一个方法中包含的所有字节码编译成机器码后再执行。

前者的优势在于无需等待编译,而后者的优势在于实际运行速度更快。

HotSpot 默认采用混合模式,综合了解释执行和即时编译两者的优点。它会先解释执行字节码,而后将其中反复执行的热点代码,以方法为单位进行即时编译。

HotSpot 内置了多个即时编译器:C1、C2 和 Graal。Graal 是 Java 10 正式引入的实验性即时编译器。引入多个即时编译器,是为了在编译时间和生成代码的执行效率之间进行取舍。

C1 又叫做 Client 编译器,面向的是对启动性能有要求的客户端 GUI 程序,采用的优化手段相对简单,因此编译时间较短。

C2 又叫做 Server 编译器,面向的是对峰值性能有要求的服务器端程序,采用的优化手段相对复杂,因此编译时间较长,但同时生成代码的执行效率较高。

从 Java 7 开始,HotSpot 默认采用分层编译的方式:热点方法首先会被 C1 编译,而后热点方法中的热点会进一步被 C2 编译。

为了不干扰应用的正常运行,HotSpot 的即时编译是放在额外的编译线程中进行的。HotSpot 会根据 CPU 的数量设置编译线程的数目,并且按 1:2 的比例配置给 C1 及 C2 编译器。

在计算资源充足的情况下,字节码的解释执行和即时编译可同时进行。编译完成后的机器码会在下次调用该方法时启用,以替换原本的解释执行。

参考资料

深入拆解Java虚拟机

asmtools.jar

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 微软 Credential Providers 详解一《调用原理》

    在 XP 时代,微软提供了 GINA 的接口来让我们对系统登录界面进行定制,在 Win7 以上系统中,微软提供了另外一种接口,就是 Credential Pro...

    我与梦想有个约会
  • 移植python到小米路由器记录。

    最近抢了一个小米路由器,研究了一下,总的来说现在看起来功能还很少。现在比较有用的功能就是,远程下载功能,支持迅雷,电驴等,不过现在看电影啥的都是直接在线看的,基...

    用户2398817
  • Python随笔(四)、python基础

    05 python s12 day4 迭代器原理及使用 什么是迭代: 可以直接作用于for循环的对象统称为可迭代对象(Iterable)。* 可以被next(...

    用户2398817
  • Sublime3快捷键大全

     Sublime Text3比起Notepad++,UltraEdit之类Code编辑器来说配合着各种插件使用,Sublime Text在实际的使用中变得非常的...

    用户2398817
  • 1.Python环境配置

    工欲善其事必先利其器,python学习首先要做得就是配置python环境。配置环境只需要下载Pycharm 和 Anaconda两个安装包即可,请跟上我得步伐,...

    猿说python
  • sublime text 3 生成并安装

    1、打开网址http://tmtheme-editor.herokuapp.com/#!/editor/local/Monokai

    用户2398817
  • unity3d纹理格式设置

    用户2398817
  • 使用Python绘制雷达图

    import numpy as np import matplotlib.pyplot as plt #标签 labels = np.array(['3℃...

    用户2398817
  • Spring2 Hibernate3 J

    <beans xmlns="http://www.springframework.org/schema/beans"

    用户2398817
  • python部署thrift服务以及客户

    Linux环境:thrift --gen java importservice.thrift

    用户2398817

扫码关注云+社区

领取腾讯云代金券