什么是JVM?
关联课程内容
- 基础篇-初识JVM
- 基础篇-Java虚拟机的组成
回答路径
- JVM的定义
- 作用
- 功能
- 组成
# 1、定义
JVM 指的是Java虚拟机( Java Virtual Machine )。JVM 本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件,Java虚拟机上可以运行Java、Kotlin、Scala、Groovy等语言。
启动这个程序:
package q1jvm;
import java.io.IOException;
//用java命令启动一个jvm进程,执行程序
public class C01JVM {
public static void main(String[] args) throws IOException {
System.in.read();
}
}
任务管理器中启动的Java进程,其实是一个虚拟机进程,它会执行我们编写好的代码。
通过jps
命令也可以看到java进程,jps
是JDK自带的一共显示Java进程的小工具:
只要能编译成Java字节码文件的语言,Java虚拟机都可以运行。下图是Groovy语言在Java虚拟机上成功运行的结果:
# 2、作用
为了支持Java中Write Once,Run Anywhere;编写一次,到处运行的跨平台特性。
对于C/C++这类语言来说,需要将源代码编译成对应平台(不同的操作系统+CPU架构)的机器码,才能让计算机运行。不满足一次编译,到处运行的跨平台特性。
但是Java语言不同,Java语言将源代码编译成字节码文件之后,就可以交由不同平台下已经安装好的Java虚拟机。Java虚拟机会将字节码指令实时解释成机器码。这样就满足了一次编译(编译成字节码),到处运行的跨平台特性。
# 3、功能
- 解释和运行,对字节码文件中的指令,实时的解释成机器码,让计算机执行。
- 内存管理,自动为对象、方法等分配内存,自动的垃圾回收机制,回收不再使用的对象。
- 即时编译,对热点代码进行优化,提升执行效率。
执行以下代码:
package q1jvm;
//-Xint 禁止JIT即时编译器优化
public class C03Usage {
public static void main(String[] args) {
long start = System.currentTimeMillis();
C03Usage test = new C03Usage();
test.jitTest();
long end = System.currentTimeMillis();
System.out.println("执行耗时:" + (end - start) + "ms");
}
public int add (int a,int b){
return a + b;
}
public int jitTest(){
int sum = 0;
for (int i = 0; i < 10000000; i++) {
sum = add(sum,100);
}
return sum;
}
}
加上JIT即时编译优化之后,代码执行只需要3ms。但是如果加上-Xint
参数关闭即时编译器优化,执行时间需要233ms。
# 4、组成
编译器:不属于Java虚拟机的一部分,负责将源代码文件编译成字节码文件。- 类加载子系统,负责将字节码文件读取、解析并保存到内存中。其核心就是类加载器。
- 运行时数据区,管理JVM使用到的内存。
- 执行引用,分为解释器 解释执行字节码指令;即时编译器 优化代码执行性能; 垃圾回收器 将不再使用的对象进行回收。
- 本地接口,保存了本地已经编译好的方法,使用C/C++语言实现。
# 5、常见的JVM
# 总结
1、JVM 指的是Java虚拟机,本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件,作用是为了支持跨平台特性。
2、JVM的功能有三项:第一是解释执行字节码指令;第二是管理内存中对象的分配,完成自动的垃圾回收;第三是优化热点代码提升执行效率。
3、JVM组成分为类加载子系统、运行时数据区、执行引擎、本地接口这四部分。
4、常用的JVM是Oracle提供的Hotspot虚拟机,也可以选择GraalVM、龙井、OpenJ9等虚拟机。