------------恢复内容开始------------
目录:
1、Java及JVM简介
2、Java发展的重大事件
3、虚拟机与Java虚拟机
4、JVM的整体结构
5、Java代码执行流程
6、JVM的架构模型
7、JVM的生命周期
8、JVM的发展历程
1、Java及JVM简介
Java是一门跨平台的语言,运行Java程序需要依靠JVM,我们都知道Java运行的流程是先编译为class文件,然后再由JVM解释执行,就像下面的图一样:
我们Java的特点就是一处编译,处处运行,那么我们处处运行所依靠的就是JVM虚拟机,JVM虚拟机只要求你给它符合JVM规范的字节码文件,那么你只需要在你的平台上装上适合你平台的JVM,然后我们不需要关系代码,直接将字节码文件让JVM运行就行了。
但是你可能不知道JVM的强大之处,JVM它不仅仅可以用来运行Java,还可以运行其他其他语言,如果你没去了解过,可能你会不信,但是事实就是这样的,如下图:
从这里我们可以得知,JVM可以看作一个运行的容器,它运行的东西就是字节码文件,但是字节码文件从哪里来,它最初是什么语言,这些都不重要,只要字节码文件符合了JVM给出的规范(具体规范可查看官网),那么就可以运行。
那么既然JVM可以运行多种语言,那么以后的趋势就可能变成多语言混合开发,让各个语言使在他们最擅长的地方,正所谓没有最好的语言,只有最适合的语言,那么我们混合开发在不同的场景使用不同的语言,岂不美哉吗?
需要注意哈,Java可能不是最吊的语言,但是JVM一定是最吊的虚拟机。
看到这里你可能还会有疑问,Java语言本身和JVM到底啥关系?
最初Java出来的时候,JVM(Java Virtual Machine)就伴随着出现,以前却是JVM是用来搞Java的,但是随着JVM不断地迭代更新,现在的JVM不仅仅可以用来执行Java,执行的字节码文件只要符合JVM规范即可。
通俗易懂点:原来Java是JVM的女朋友,但是随着JVM的成长,JVM现在想给更多的女孩一个家,嗯,就这样。
2、Java发展的重大事件
1):1990年,在sun公司中,由Patrick Naughton、MikeSheridan及James Gosling领导的小组Green Team,开发出的新语言,命名为Oak,后期改名为Jav 1a
2):1995年,sun正式发布Java和HotJava产品,Java首次公开亮相
3):1996年,在1月23日sub发布了JDK1.0
4):1998年,JDK1.2版本发布。同时,sun发布了jsp/servlet、EJB规范,以及将Java分成了J2EE,J2SE,J2ME。这表明了Java开始向企业、桌面应用和移动设备领域挺进。
5):2000年,JDK1.3发布,Java HotSpot Virtual Mechanical正式发布,成为Java默认的虚拟机。
6):2002年,JDK1.4发布,古老的Classic虚拟机退出了舞台。
7):2003年年底,Java平台的Scala正式发布,同年Grovy也加入了Java阵营。
8):2004年,JDK1.5发布。同时JDK1.5改名为JDK5.0
9):2006年,JDK1.6发布,同年,Java开源并建立了OpenJDK,然后HotSpot就成为了OpenJDK的默认虚拟机。
10):2007年,Java平台迎来了新伙伴Clojure
11):2008年,Oracle收购EBA,得到了JRockit虚拟机
12):2009年,Twitter宣布把后台大部分程序从Ruby迁移到Scala,这又是Java平台的又一次大规模应用。
13):2010年,Oracle收购了Sun,获得Java商标和最具价值的HotSpot虚拟机,此时,Oracle拥有了占有市场份额最高的两款虚拟机,HotSpot和JRockit,并未来计划进行整合为HotRickit(但是后面其实没有整合,只是将JRockit中一些优秀的部分借鉴到了HotSpot中)。
14):2011年,JDK7发布,在jdk1.7u4中,正式启用了新的垃圾回收器G1
15):2017年,JDK9发布,将G1设置为默认,替代了CMS
同年,IBM的J9虚拟机开源,并形成现在的Open J9社区。
16):2018年,Android的Java侵权案判决,Goole赔偿Oracle19亿美元
同年,Oracle宣告JavaEE成为历史名词,JDBC、JMS、Servlet赠与予Eclipse基金会。
同年,JDK11发布,LTS版本的JDK,发布革命性的ZGC,调整JDK授权许可
17):2019年,JDK12发布,加入RedHat领导开发的Shenandoah GC
3、虚拟机与Java虚拟机
虚拟机:
虚拟机就是一台虚拟的计算机,它是一款软件,用来执行一系列虚拟的计算机指令,大体上虚拟机可以分为系统虚拟机和程序虚拟机。
系统虚拟机就是VmWare这种,完全对物理计算机的仿真。
程序虚拟机就是JVM这种,专门为执行单个计算机程序而设计。
无论是系统虚拟机还是物理虚拟机 ,都会收到虚拟机提供的资源限制中。
Java虚拟机:
Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成。
JVM平台的各种语言共享Java虚拟机带来的跨平台性、优秀的垃圾回收机制、以及可靠的即时编译器。
Java技术的最核心部分都是JVM(Java Virtual Machine)虚拟机,因为所有的程序都需要运行在JVM中
Java虚拟机的作用:
Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令。每一条Java指令,Java虚拟机规范中都有详细的定义,比如如果存操作数,取操作数,处理结果存放在哪等。
Java虚拟机的在计算机中的位置:
JVM是在操作系统之上的,它并不会直接操作硬件。
4、JVM的整体结构
JVM整体结构的一个简图。
5、Java代码执行流程
首先Java源码由Java编译器翻译为class字节码文件,然后将字节码文件交由Java虚拟机解释运行,首先是由类加载器加载,然后校验字节码文件合法,然后由解析器和即时编译器进行执行(HotSpot才是这样的)。
课程中的解释:
1、编译器编译过程中,任何一个节点执行失败就会造成编译失败。
2、虽然各个平台的JVM虚拟机内部实现细节不同,但是它们共同执行的字节码内容却是一样的。
3、JVM的主要任务就是讲字节码装载到其内部,解释/编译为对应平台上的机器指令(即:汇编语言)执行。
4、Java虚拟机使用类加载器(Class Loader)装载class文件。
5、类加载完成之后,会进行字节码校验,字节码校验通过只有JVM解释器会把字节码翻译为机器码(即汇编语言)交由系统执行。
6、并不是所有代码都是解释执行的,比如HotSpot虚拟机,它就是配合着JIT(即时编译器)做代码缓存一起用的。
6、JVM的架构模型
JVM的架构模型大致分为两种:
基于栈的指令集架构、基于寄存器的指令集架构。
区别这两种架构之间的区别:
基于栈的指令集架构:
1:设计和实现更简单,适用于资源受限的系统
2:避开了寄存器的分配难题,使用零地址指令方式分配
3:指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。指令集更小,编译容易实现。(但是指令数量比寄存器多很多)
4:不需要硬件支持,可移植性好,更好实现跨平台
基于寄存器的指令集架构:
1:典型的应用是x86的二进制指令集:比如传统的PC以及Android的Daalik虚拟机
2:指令集架构完全依赖硬件,可移植性差
3:性能优秀和执行更高效
4:话费更少的指令去完成一项操作。(但是单个指令的大小比基于栈的更大)
5:在大部分情况下,基于寄存器架构的指令集往往都以一地址指令、二地址指令和三地址指令为主,而基于栈架构的指令集却是以零地址指令为主
举例一个操作图:
7、JVM的生命周期
8、JVM的发展历程
Sun classic VM
Exact VM
HotSopt VM
JRoickt
J9
CDC/CLDC HotSpot
Azul VM
Liquid VM
Apach Hermony
Microsoft JVM
TaoBaoJVM
Dalvik VM
其他
Graal VM
本文仅仅是记录笔记,切勿当真。