英⽂:Java Virtual Machine
中⽂:Java虚拟机,vmware虚拟机运⾏的是操作系统,Java虚拟机运⾏的是Java程序
JVM跨平台原理
JVM就是⼀个运⾏在操作系统上的程序,就像微信、QQ⼀样,不同操作系统上的JVM安装包不⼀样,⽽
我们说的JDK和JRE就是JVM的安装包,我们双击QQ图标就能运⾏QQ,⽽我们运⾏java命令就能运⾏
JVM,不管操作系统是什么,JVM运⾏起来后提供的功能是⼀样的,都是⽤来执⾏代码的,就像不同操
作系统上的QQ、微信⼀样,都是⽤来聊天的。
| 安装包 | 启动方式 | 运行内容 | |
|---|---|---|---|
| QQ安装包 | 双击QQ图标 | 发送和接收⽂字 | |
| JVM | JDK/JRE安装包 | java –jar xxx.jar | 运⾏Java代码(本质 |
| 上…) |
不同操作系统上运⾏的JVM是不⼀样的,这才是JVM跨平台的本质!我们写⼀份Java代码,编译为字节 码后,之所以能在不同操作系统上运⾏,就是因为不同操作系统上的JVM都能运⾏字节码,相当于不同 操作系统上的JVM屏蔽了不同操作系统的底层区别。
那字节码的作⽤是什么呢?
JVM会逐⾏解释执⾏字节码,那为什么不逐⾏解释执⾏Java代码呢?不⼀样吗,⼀份Java代码对应的字 节码是⼀样的,⼀对⼀的关系,为什么要把Java代码编译为字节码,因为性能,为了提⾼效率,如果直 接把Java代码翻译为机器指令,也不是不⾏,也就是解释执⾏,这样就会导致Java代码再运⾏时效率⽐ 较低,⼀般的解释型语⾔效率都⽐较低,⽽如果我们提前先对Java代码进⾏编译,编译为字节码,那字 节码再翻译为机器指令时,效率⽐较块,也就导致真正执⾏字节码时,效率会⽐较⾼,这就是字节码的 作⽤,所以Java其实是编译+解释⼆合⼀的语⾔。
JVM关⼼的是字节码,⽽不是Java代码,所以⼀⻔语⾔只要能编译为字节码,那么也能在JVM上运⾏。
JVM整体结构
先将java⽂件编译为class⽂件,再利⽤类加载器将class⽂件加载到⽅法区中,然后由解析器逐⾏执⾏字
节码,每执⾏⼀个Java⽅法,就将⽅法存⼊Java栈,每执⾏⼀个本地⽅法,也就是native⽅法,就将⽅
法存⼊本地⽅法栈中,⽅法执⾏完后就从栈中移除,程序计数器⽤来记录待执⾏的下⼀条字节码指令地
址,⽅法执⾏过程中产⽣的Java对象会存⼊堆中,垃圾回收器会回收已经没有被使⽤的Java对象,JIT编
译器会在程序运⾏过程中发现热点代码,并编译为机器指令,从⽽提⾼执⾏效率。
后续写类加载⼦系统、类加载器的分类