JVM
1. 简介
Java: 作为TIOBE长期霸榜的编程语言,Java因为其跨平台,庞大的用户群体和软件生态,是最受推崇的语言,是一种程序员必学招式之一;(跨平台的语言)
JVM: "Write once,Run everywhere"的基石.(跨语言的平台:除了Java,还能运行Kotlin,Clojure,Groovy,Scala,Jython,JRuby,JavaScript 只要这些语言的编译器生成的字节码文件,符合JVM的规范即可)
Java不是最强大的语言,JVM是最强大的虚拟机
1.1. Java发展史
- 1990年,Sun公司的Green Team开发了一个新的程序语言,命名为Oak,后期命名为Java
- 1995年,Sun公司正式发布Java和HotJava产品,Java首次公开亮相
- 1996年,Sun MicroSystems 发布JDK 1.0
- 1998年,JDK 1.2发布,指定JSP/Servlet EJB规范,Java分成了J2EE,J2SE,J2ME;
- 2000年.JDK1.3 发布,Java HotSpot Virtual Mechine 正式发布,成为Java默认虚拟机
- 2002年,JDK1.4 发布,古老的Classic虚拟机退出历史舞台
- 2003年,Java平台的Scala正式发布,Groovy也加入Java阵营
- 2004年,JDK 1.5正式改名为JavaSE 5.0
- 2006年,JDK 6 发布,同年,开源OpenJDK,HotSpot成为OpenJDK默认虚拟机
- 2007年,Clojure加入Java平台
- 2008年,Oracle收购BEA得到了JRockit虚拟机
- 2009年,Twitter把后台从Ruby迁移到Scala,是Java平台的又一次大规模应用
- 2010年,Oracle收购了Sun,获得Java商标和HotSpot虚拟机
- 2011年,JDK7发布,在JDK 1.7u4中,正式启用了新的垃圾回收器G1
- 2017年,JDK9发布,将G1设置为GC,替代CMS
- 2017年,IBM的J9开源,形成了现在的Open J9社区
- 2018年,JDBC JMS Servlet赠与Eclipse基金会
- 2018年,JDK 11发布,发布革命性的ZGC,调整JDK授权许可
- 2019年 JDK12发布,加入RedHat领导开发的Shenandoah GC
1.2. JVM的架构模型
1.2.1 指令集的架构模型
-
基于栈 的指令集架构(Java HotSpot虚拟机就是用的这种架构)
-
设计和实现简单,适用于资源受限的系统
-
避开了寄存器的分配难题,使用零指令方式分配
-
可移植性强,不需要硬件支持
-
-
基于寄存器的指令集架构(了解一下)
- 典型的应用是x86的二进制指令,比如传统的PC和Android的Davlik虚拟机
- 指令集结构完全依赖硬件,可移植性差
- 指令数少
举例 : 2+3 两种指令集指令:
基于栈的指令集
iconst_2 //常量2入栈 istore_1 iconst_3 // 常量3入栈 istore_2 iload_1 iload_2 iadd //执行加法 isstore_0
基于寄存器的计算流程:
mov eax,2 //将寄存器eax的值设为2 add eax,3 //将寄存器eax的值加3
1.3. JVM的生命周期
1.3.1 虚拟机的启动
Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(init class)来完成的,这个初始类是由Java虚拟机的具体实现指定的.
1.3.2 虚拟机的执行
- 一个运行中Java虚拟机就是为了执行Java程序;
- 虚拟机随着程序运行而运行;
- 执行一个所谓的Java程序的时候,真正执行的是一个Java虚拟机进程.
1.3.3 虚拟机退出
- 程序正常执行结束
- 程序异常或错误
- 操作系统错误导致虚拟机退出
- 由于某线程调用Runtime类或System类的exit方法,或者Runtime类的halt方法,并且Java安全管理器允许此操作
- JNI(Java Native Interface)用JNI Invocation API来加载或卸载Java虚拟机