JVM解释器和编译器

时间:2023-12-24 14:25:13

首先看一个命令

[root@insure ~]# java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) -Bit Server VM (build 25.191-b12, mixed mode)

再看几个名词

Java(TM) SE Runtime Environment (build 1.8.0_191-b12) java运行环境

hotspot包括server和client两种模式的实现:

Java HotSpot Client VM(-client),为在客户端环境中减少启动时间而优化;

Java HotSpot Server VM(-server),为在服务器环境中最大化程序执行速度而设计。

mixed mode 表示是混合模式 解释器和编译器都有

启动时间上client模式较快,运行速度上server模式较快,最重要的是server垃圾回收处理的好。

以idea为例

在配置文件D:\Program Files\JetBrains\IntelliJ IDEA 2018.2.1\jre64\lib\amd64下有一个

jvm.cfg文件

-server KNOWN
-client IGNORE #idea直接忽略掉了client模式

再看/jre/bin目录下面,竟然只有server文件夹,看来真的忽略了client模式

JVM解释器和编译器

在centos7的服务器上面看了一下配置  jdk8也忽略掉了client模式

在主流商用JVM(HotSpot、J9)中,Java程序一开始是通过解释器(Interpreter)进行解释执行的。当JVM发现某个方法或代码块运行特别频繁时,就会把这些代码认定为“热点代码(Hot Spot Code)”,然后JVM会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为:即时编译器(Just In Time Compiler,JIT)

编译器和解释器的区别

java编译器:将Java源文件(.java文件)编译成字节码文件(.class文件,是特殊的二进制文件,二进制字节码文件),这种字节码就是JVM的“机器语言”。javac.exe可以简单看成是Java编译器。

java解释器(英语:Interpreter):是JVM的一部分。Java解释器用来解释执行Java编译器编译后的程序。java.exe可以简单看成是Java解释器。

在结合一段程序理解

public class Test {
    public static void main(String[] args) {
        System.out.println("hello world");
    }
}

第一次运行代码:编译->解释->生成机器码(即生成Test.class文件)

JVM解释器和编译器

第二次编译:编译->执行(JIT即时编译,不用再生成.class文件,提高运行效率)

JVM解释器和编译器

当程序需要迅速启动和执行的时候,解释器可以首先发挥作用,省去编译的时间,立即执行。

编译器可以逐渐发挥作用,把越来越多的代码编译成本地代码,之后可以获得更高的效率(占内存)

解释器与编译器搭配使用的方式:
1、默认(java -version混合模式)
2、解释模式(java -Xint -version)仅使用解释器方式执行
3、编译模式(java -Xcomp -version)优先采用编译方式执行程序,但解释器要在编译无法进行的情况下介入执行过程