Java和Java虚拟机
跟随宋红康老师学习JVM的学习笔记
Java——跨平台的语言
.java文件通过编译生成字节码(.class)文件
Java虚拟机——跨语言的平台(执行Java字节码)
不同的高级语言通过各自的编译器编译所生成的字节码文件只要符合Java虚拟机的规范即可运行。
- 操作系统不识别字节码文件,只识别机器语言,执行引擎就是字节码转换成机器语言,从而让程序执行。
常见的Java虚拟机
- JRockit
- HotSpot(JDK8中将JRockit和HotSpot进行了整合)
- IBM的J9
Java虚拟机的特点
1. 一次编译,到处运行
2. 自动的内存管理
3. 自动的垃圾回收功能
JVM的整体结构(HotSpot虚拟机)
## JVM的整体架构
反编译:
javap -v (字节码文件名)
Java编译器的指令流是一种基于栈的指令集架构,另一种指令集架构被称作基于寄存器的指令级架构
基于栈的指令集架构的特点:
- 使用零地址指令方式
- 指令集更小
- 跨平台性更好
- 性能比寄存器差
基于寄存器的指令级架构的特点:
- 可以执行差
- 执行效率和性能高
- 花费更少的指令去完成一项操作
JVM的生命周期
-
启动:JVM的启动是通过引导类加载器(Bootstrap class loader)创建一个初始类(initial class)来完成的。父类比子类先加载。
-
执行:每个Java程序的执行,真正执行的是一个JVM进程。程序开始执行时开始,程序结束时停止。
-
退出:程序正常执行结束、程序出现异常、操作系统的问题、或者某线程执行Runtime类的halt方法以及System类的exit方法。
Java虚拟机的发展历程
-
Sun Classic VM:该虚拟机内部只提供解释器,如果需要JIT,则需要外挂,解释器和及时编译器不能配合工作。
问题:为什么JVM不用JIT全称编译,而是采用解释器+JIT(及时编译器)混合执行引擎?
解释器的执行过程:
字节码 ——> 解释器 解释执行 ——> 执行结果
JIT及时编译器的执行过程:
字节码 ——> 编译器 编译 ——> 编译后的代码 ——> 执行 ——> 执行结果
-
HotSpot VM(热点代码探测技术):方法区的概念都是针对HotSpot来讲的,其他的VM都没有,通过计数器找到最具编译价值的代码(热点代码),在本地缓存起来,通过解释器和JIT协同工作,在最优化的程序响应时间和程序性能中取得平衡。
-
JRockit:专注于服务器端应用,不太关注程序的启动速度,内部不包含解析器实现,全部代码都靠JIT编译并执行。JRockit VM是世界上最快的虚拟机。
-
IBM J9: 为IBM自身的服务器和系统有着很好的耦合和优化。