JVM学习(1)——java代码运行

JRE与JDK的区别

我们经常听到JRE和JDK,这两个是不一样的东西,JRE(Java Runtime Environment)仅包含运行java程序的必须组件(jvm和java核心类库等)。而我们作为开发人员,平时用到的都是JDK(Java Development Kit),其包含了JRE,还附带了一系列的开发工具。

java代码是怎么被机器运行的

java是一门高级语言,机器无法直接运行,所以要让机器运行我们的java代码就需要进行如下历程才能最终被我们的机器执行。

  1. .java文件:我们的java源码
  2. .class文件:编译器(IDE)编译过后的字节码文件
  3. 机器码:JVM翻译成机器码

jvm翻译方式

在上面的第3点,JVM会把字节码文件翻译成机器码才能让机器去运行我们的代码,目前在HotSpot虚拟机中,有两种翻译形式,分别如下

  • 解释执行:Hotspot虚拟机把字节码逐条翻译成机器码,执行。
  • 即时编译(Just-In-Time compilation,JIT):把一个方法中的所有字节码翻译成机器码再去执行

两种翻译方式的优缺点

1.解释执行
优点:

  • 无需等待编译,直接就可以跑

  • 可移植性强,只要有合适的解释器,代码就可以在任意平台上面跑

  • 代码启动速度比编译执行快

缺点:

  • 执行速度比编译执行慢

2.编译执行
优点:

  • 执行效率比解释型代码快

缺点:

  • 必须等待编译才可以跑
  • 编译成特定平台的机器码,可移植型弱

两种翻译方式的结合

两种解释方式都有各自的优缺点,有没有办法综合,做个平衡呢?

答案是显然的,接下来要介绍的Hotspot VM就是一个结合两种方法的实现。

接下来你可能会有下面几个疑问

  1. 什么Hotspot VM?
    HotSpot VM,是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机。
  2. Hotspot VM是怎么执行字节码的?
    它会先解 释执⾏行行字节码,⽽而后将其中反复执⾏行行的热点代码,以⽅方法为单位进⾏行行即时编译,即两种翻译方式的结合。
  3. Hotspot中有多少个编译器?
    在Hotspot中内置了多个及时编译器:C1,C2,Graal

    • C1: Client 编译器器,⾯面向的是对启动性能要求较⾼高的程序,采⽤用的优化⼿手段相对简单,因 此编译时间较短,缺点就是执⾏行行效率较低。

    • C2:Server 编译器器,⾯面向的是对峰值性能有要求的服务端程序,采⽤用的优化⼿手段相对复 杂,因此编译时间较⻓长,但⽣生成的字节码执⾏行行效率较⾼高。

    • Graal: Java 10 正式引⼊入的实验性即时编译器器。

JVM执行Java字节码

在了解怎么执行java字节码之前,要先知道JVM的内存管理。java管理的内存分为2部分,一部分是线程共享的,包含方法区(Method area)和java堆(Java heap)

这里写图片描述

JVM执行字节码步骤:

  1. 加载需要执行的字节码到内存中
  2. 把加载后的Java类存放到方法区
  3. 运行过程中,每进入一个java方法,JVM会在当前线程的方法栈中生成一个栈帧,用于存放局部变量以及字节码操作数,压入栈
  4. 退出当前执行方法时,JVM会弹出当前线程的栈帧,将其丢弃,无论其是否正常返回

猜你喜欢

转载自blog.csdn.net/x1032019725/article/details/81207825