JVM - 跨平台、执行方式和JIT

什么是JVM

JVM:java virtual machine(java虚拟机)

个人理解:jvm就相当于一台机器,类似于vmware那种的虚拟机,本身也是使用的物理机的CPU和内存,只不过它只是执行class字节码的机器,然而为什么要引入虚拟机呢?是为了保证跨平台的运行。

跨平台性

常用的操作系统有windows和(类)unix,他们执行的程序是不一样的,比如说windows的可执行文件是exe,而linux没有扩展名,他们执行机制也是不一样的,所以改扩展名也是没有用的哦。也就是说,如果我们编译一个项目的话,是需要对不同的操作系统进行对应的打包编译的。
而java正好克服了这一点,通过javac编译后的代码生成了class文件,这个class文件可以被jvm识别,jvm会翻译class文件,生成相应的机器码,这就实现了一次编译,到处运行了
jvm

class文件

class文件实际上就是一行行的指令,可以通过javap命令来查看字节码文件,如下面代码所示

Compiled from "first.java"
public class top.zunmx.first {
  public top.zunmx.first();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: ldc           #2                  // String Hello world
       2: astore_1
       3: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
       6: aload_1
       7: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      10: return
}

jvm的执行方式

解释模式:启动快,但是运行效率低,用 -Xint 开启, 在这种模式下全部采取解释模式运行。

编译模式: 启动慢,执行快,用 -Xcomp开启,这种模式下将采用编译模式运行。

混合运行模式:起始阶段解释,热点代码编译, 用 -Xmixed 开启,即混合运行模式,也是Hotspot的默认模式。

效果测试

启动参数设置

测试代码

package top.zunmx;

public class first {
    public static void main(String[] args) {
        for (int i = 0; i < 200; i++) {
            long start = System.nanoTime();
            for (int j = 0; j < 1000; j++) {
                new Object();
            }
            long end = System.nanoTime();
            System.out.printf("%d\t%d\n", i, (end - start));
        }
    }
}

-Xint 模式

0 16700
1 16700
2 15600
3 15100
...
196 19100
197 19500
198 19500
199 20300

-Xcomp

0 5700
1 2600
2 5800
3 2500
...
196 2200
197 2300
198 1600
199 2300

-Xmixed

0 24500
1 24500
2 23000
3 34800
...
22 24400
23 20800
24 21400
25 23500
26 2400
27 2300
28 2400
29 2200
30 2100
31 2300
...
192 2200
193 2400
194 2400
195 2200
...
196 2200
197 2700
198 2300
199 2200

JIT

热点代码:使用次数多的代码,比如说一个循环。
如果这个循环循环了10000次,每次都要解释成机器语言,显得就不明智了,所以这个时候引入了JIT(即时编译just-in-time)

JIT把热点代码编译成机器码,往后运行的话就不进行解释了,走编译后的代码,这样就提高了运行效率了。

JIT工作流程

jvm为每个代码块和方法设置了计数器,每执行一次就会加一,当超过限定次数后,就会交给JIT处理,但是JIT编译比较耗时,当没有编译完成时,依然会继续解释执行。

JIT提交流程

评论 0

还没有评论,来说点什么吧。

提交后需要审核才会公开。