Loading... # 什么是JVM JVM:java virtual machine(java虚拟机) 个人理解:jvm就相当于一台机器,类似于vmware那种的虚拟机,本身也是使用的物理机的CPU和内存,只不过它只是执行class字节码的机器,然而为什么要引入虚拟机呢?是为了保证跨平台的运行。 ## 跨平台性 常用的操作系统有windows和(类)unix,他们执行的程序是不一样的,比如说windows的可执行文件是exe,而linux没有扩展名,他们执行机制也是不一样的,所以改扩展名也是没有用的哦。也就是说,如果我们编译一个项目的话,是需要对不同的操作系统进行对应的打包编译的。 而java正好克服了这一点,通过`javac`编译后的代码生成了class文件,这个class文件可以被jvm识别,jvm会翻译class文件,生成相应的机器码,这就实现了`一次编译,到处运行`了 ![jvm](https://www.zunmx.top/usr/uploads/2023/07/3541342416.png) # class文件 class文件实际上就是一行行的指令,可以通过`javap`命令来查看字节码文件,如下面代码所示 ```java 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的默认模式。 ## 效果测试 ![启动参数设置](https://www.zunmx.top/usr/uploads/2023/07/3138017071.png) ### 测试代码 ```java 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提交流程](https://www.zunmx.top/usr/uploads/2023/07/3870302328.png) © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏