初识JVM
一、概述
-
Java不仅是一门编程语言,还是一个由一系列计算机软件和规范组成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于嵌入式系统,移动终端、企业服务器、大型机等场合。
-
它提供了一种相对安全的内存管理和访问机制,避免了绝大部分内存泄漏和指针越界。
-
它实现了热点代码检测和运行时编译及优化
-
它有一套完整的应用程序接口
二、Java技术体系
##### Java体系包含:
Java程序设计语言
各种硬件平台上的Java虚拟机实现
Class文件格式
Java类库的API
来自商业机构及开源社区的第三方Java类库
-
JDK
包含 Java程序设计语言、Java虚拟机、Java类库,是支持Java程序开发的最小环境
-
JRE
Java类库API中的JavaSE API子集和Java虚拟机,是支持Java程序运行的标准环境
-
四条主要的产品线
Java Card:支持Java小程序(Applets)运行在小内存设备上的平台
Java ME:支持Java程序运行在移动终端
Java SE:支持面向桌面级应用的Java平台
Java EE:支持使用多层架构的企业应用的Java平台
三、Java发展史
-
1991年4月,James Gosling 博士领导的绿色计划(Green Project)启动,目标是开发能够在各种消费电子品上运行的程序架构,Oak。
-
1995年5月23日,Oak语言改名为Java,并在SunWorld大会上正式发布Java1.0,提出“Write Once,Run Anywhere”
-
1996年1月23日,JDK1.0发布,java语言有了第一个正式版本的运行环境
-
1996年5月底,Sun公司于美国旧金山举行首届JavaOne大会
-
1997年2月19日,
Sun公司发布JDK1.1,提出了JDBC、JAR文件格式、JavaBeans、RMI。Java语法增加了内部类和反射。
-
1998年12月4日,JDK发布里程碑式版本1.2,Sun将Java技术体系拆分为三个方向:J2SE、J2EE、J2ME
JDK1.2首次内置了JIT(即时编译器),Java语言添加了strictfp关键字、Collections集合
-
1999年4月27日,HotSpot虚拟机诞生。
-
2000年5月8日,JDK1.3发布,从此之后的所有JDK全部使用HotSpot虚拟机。
-
2002年2月13日,JDK1.4发布,是Java真正走向成熟的一个版本。增添了正则表达式、异常链、NIO、日志类、XML解析器和XSLT转换器。
-
2004年9月30日,JDK5发布,版本号不再使用1.x。Java语法增添自动装箱、泛型、动态注解、枚举、可变长参数、遍历循环(foreach循环)等
-
2006年12月11日,JDK6发布。JDK6改进:提供初步的动态语言支持、提供编译器注解处理器和微型HTTP服务器API。HotSpot虚拟机中改进了:锁与同步、垃圾收集、类加载等。
-
2009年2月19日,JDK7发布,2009年4月20日,Oracle宣布以74亿美元的价格收购市值超过2000亿美元的Sun公司,Java商标正式归Oracle所有。
-
2014年3月18日,JDK8发布。改进如下:
对Lambda表达式的支持
内置Nashorn JavaScript引擎支持
新的时间、日期API
彻底移除HotSpot永久代(方法区)
…
-
2017年9月21日,JDK9发布。增强了若干工具(JS Shell、JLink、JHSDB),整顿了HotSpot各个模块各自为战的日志系统,支持HTTP2客户单API等91个JEP。
-
2018年3月20日,JDK10发布。统一源仓库、统一垃圾收集器接口、统一即时编译器接口等。
-
2018年9月25日,JDK11发布,这是一个LTS版本的JDK。出现了ZGC革命性的垃圾收集器,Oracle将JDK11之前的商业特性全部开源给OpenJDK,故OpenJDK11和OracleJDK11的代码和功能在本质上完全相同。
-
2019年3月20日,JDK12发布,只包含8个JEP,其中主要有Switch表达式、Java微测试套件(JMH)等。
四、Java虚拟机家族
-
虚拟机始祖:Sun Classic / Exact VM
Sun Classic虚拟机是世界上第一款商用Java虚拟机。
Exact VM:使用了准确式内存管理(Exact Memory Management),可以知道内存中某个位置的数据具体是什么类型。
-
武林盟主:HotSpot VM
准确式内存管理
热点代码探测技术:可以通过执行计数器找到最具有编译价值的代码。
-
其它等等
五、展望Java未来
-
无语言倾向
Graal VM,也被称为“Universal VM”、“Polyglot VM” ,是一个在HotSpot基础上增强而成的跨语言全栈虚拟机。
程序特化,将其它语言(C/C++、Python、Javascript等)的源代码或其编译后的中间格式通过解释器转换为能被Graal VM接收的中间表示。Truffle工具集用来快速构建面向一种语言的解释器。
-
新一代即使编译器
HotSpot虚拟机有两个编译器:C1,客户端编译器;C2,服务端编译器
Graal编译器,用来替代C2,可以有更复杂的优化(如“部分逃逸分析”),更激进的预测性优化
-
向Native迈进
为应对近年来大型单体应用构架转向小型微服务应用构架发展,Java逐步开始对提前编译(AOT)提供支持。
AppCDS:允许把加载解析后的类信息缓存起来,提升下次启动速度。并在JDK10后,可以面向用户程序的类型信息共享(原先的CDS只面向Java标准库)、无操作的垃圾收集器(Epsilon,只做内存分配而不做回收的的收集器,对于运行完就退出的应用十分合适)。
Substrate VM:是Graal VM 0.2版本中一个极小型的运行时环境,包括独立的异常处理、同步调度、线程管理、内存管理(垃圾回收)和JNI访问等组件,目标是替代HotSpot用来支持提前编译后的程序执行。同时还包含一个本地镜像的构造器(Native Image Generator),用来给用户程序建立基于Substrate VM的本地运行时镜像。该构造器采用指针分析技术,从用户提供的程序入口,搜索所有可达的代码。其轻量特性,使其十分适合嵌入其它系统,也让Graal VM支持其它语言不会有重量级的运行负担。
-
开放性和扩展性
开放信息监控接口(JVMPI)与调式接口(JVMDI) - - JDK1.4
开放工具接口(JVMTI),为所有Java虚拟机相关的工具提供本地编程接口集合,并取代JVMPI和JVMDI - - JDK6.0
开放Java语言级别的编译器接口(JVMCI),可以在JVM外增加或替换即时编译器,Graal编译器就是通过该接口植入HotSpot - - JDK9.0
重构垃圾收集器接口,统一其内部各款垃圾收集器的公共行为。 - - JDK12.0
-
语法持续增强
提供各种语法糖。。。