1. 学JVM的目的是什么?
大家学要带着目的去学 而不是说 他让我学我就学
那么 他为什么让你去学呢?
好了不卖关子了
学习JVM 可以让我们清晰在Java的程序执行流程 对方法 属性 类有着更清晰的理解 并且对学习并发也很有好处 如果说实战的话 那肯定就是JVM参数调优了
这时候 你将不会在是初学者 渐渐向着大佬迈进
当你老了,回顾一生,就会发觉:什么时候出国读书、什么时候决定做第一份职业、何时选定了对象而恋爱、什么时候结婚,其实都是命运的巨变。只是当时站在三岔路口,眼见风云千樯,你作出抉择的那一日,在日记上,相当的沉闷和平凡,当时还以为是生命中普通的一天。
对于我们来说 学JVM只是平凡的一天天 但是将会给未来的我们打下基石
2. 简单介绍JVM
跨平台与跨语言
jvm是一个跨语言的平台 现在已支持多种语言在jvm上运行
换句话说 java平台的语言 而jvm是跨语言的平台
简单来讲 我们的java源文件 经过javac命令 编译成.class文件 并不是立刻去执行的 而是要通过jvm将其翻译成机器语言 最终得以执行 只是这一切我们无法感知罢了
虚拟机
虚拟机简单分为两种 系统虚拟机而程序虚拟机
前者可以装整一个操作系统 如windows和linux 后者则是为单个程序而设计的 典型代表就是jvm
这里有必要上一张图来让大家理解下jvm所在的位置
注意 jvm并不是直接与硬件进行交互的 它的运行在操作系统上的
3. JVM架构
整体架构
整体架构如下所示 还是先建立个印象 后面需要会画
架构模型
Java编译器指令流主要分为两种 一种是基于栈的 一种是基于寄存器的
两者有什么区别呢?
基于栈架构 实现起来相对简单 且不需要依赖硬件 也就是说可以跨平台使用
而基于寄存器架构 依赖于硬件 移植性差
而为了不受硬件的限制,为了更大的跨平台性,所以java编译器实现采用的是栈式架构。
4. JVM生命周期
JVM的启动是由引导类加载器创建一个初始类来完成的,根据JVM的不同实现,该类的定义个不同。
当运行一个java程序的时候,一个JVM进程才被真正启动,程序结束,JVM也随之退出了。
共有五种情况会造成JVM退出,如果问到了,简单答个两三种就可以了,全答出来,就有些卷了,面试官可能都没那么清楚。
- 程序正常结束,JVM退出
- 出现异常导致程序退出,JVM随之退出
- 操作系统的错误导致JVM退出
- 调用Runtime.hale()或System.exit()导致JVM退出
- 用JNI Invocation API卸载JVM(C语言调用)
5. JVM的历史发展
1.最初的虚拟机sun classic
这是最古老的虚拟机,1996年Sun公司开发的第一款商用Java虚拟机,实现了解释器与编译器结合运行,解释运行速度快,编译运行效率高,结合起来使用更佳。
2.绝对霸主 HotSpot
占有绝对的市场地位,jdk1.3以后,成为openJdk和OracleJdk都默认的JVM,值得一提的是他的热点代码检测技术,通过计数器找到最具价值的代码缓存起来,提高效率。
3.第二霸主 JRocket
BEA公司研发的号称最快的JVM,这可能是在他们自家产品上实现的,专注于服务端,全部代码全部靠编译器编译执行,了解即可。
ps:该公司后期被Oracle收购,在HotSpot上移植JRocket的优秀特性。
4.第三霸主 J9
IBM公司研发的,市场地位与HotSpot接近。
5.未来霸主 Grral VM
真正跨语言的全栈JVM,可在任何平台上使用,未来可期,如果有天要替换HotSpot,那么下一个接班人必定是它了。