《深入理解Java 虚拟机》读书笔记:“第一章 走进JAVA”
前言:
学习JAVA虚拟机作用
如果开发人员不了解虚拟机的诸多技术特性的运行原理,就无法写出最适合虚拟机运行和自优化的代码。
1、概述
Java获得能广泛认可的重要原因:
- 摆脱了硬件平台的束缚,实现了“一次编写,到处运行”的理想。
- 提供了一种相对安全的内存管理和访问机制,避免了绝大部分的内存泄漏问题,
- 实现了热点代码检测和运行时编译及优化
- 有一套完善的应用程序接口,无数好用的第三方类库
2、Java技术体系
组成部分:
- Java程序设计语言
- Java虚拟机实现
- Class文件格式
- Java类库API
- 其他机构的第三方Java类库
JDK:支持Java程序开发的最小环境(Java程序设计语言+虚拟机实现+类库)
JRE:支持Java程序运行的标准环境(JavaSE API子集+Java虚拟机)
Java技术体系产品线:
- Java Card:Java 小程序
- Java ME:移动终端上运行,逐渐被Android取代
- Java SE:支持面向桌面级应用
- Java EE:支持多层架构的企业应用,在JDK10后被Oracle放弃,捐给Eclipse基金会管理,此后称作Jakarta EE
3、Java发展史
1996年JDK1.0由Sun发布
1998年发布JDK1.2,将技术体系拆解为J2SE,J2ME,J2EE
1999年HotSpot虚拟机诞生,默认的Java虚拟机
2004年JDK5发布,改版本号规则1.X为X,语法大改进,出现自动装箱,泛型,动态注解,枚举等
2006年JDK开源,形成OpenJDK
2009年Oracle收购Sun,出现Java SE Support产品计划,用户需购买支持或一直升级JDK
2011年JDK7 支持Lambda表达式等
2013年JDK8
2018年JavaEE成为历史,JDK11发布,调整JDK的授权属性,商业用户要么购买商业支持要么一直升级JDK
4、Java虚拟机家族
- 虚拟机始祖Sun Classic/Exact VM
Sun Classic:纯解释器,需外挂编译器
Exact VM:准确内存管理(虚拟机可以知道内存中的某个位置的数据具体是什么类型),性能更好
- 武林盟主HotSpot VM(后文主要讲这个)
基于准确式内存管理,通过编译器与解释器协同工作,在最优化的程序响应时间与最佳执行性能中取得平衡,无需等待本地代码输出才能执行程序,即时编译的时间压力相对较小,有助于引入更复杂的代码优化技术。
- Mobile/Embedded VM 移动终端使用
- 天下第二 BEA JRockit/IBM J9 VM
JRockit:不包括解释器实现,全部代码都靠即时编译器编译后执行
- 软硬合璧BEA liquid VM/Azul VM
与硬件平台绑定,软硬件配合工作的专有虚拟机
- 挑战者 Apache Harmony/Google Android Dalvik VM
......(有兴趣仔细了解可以看看书)
5、Java技术的未来
- 无语言倾向
Graal VM,将语言的源代码编译为中间格式通过解释器转换为被接受的中间表示,兼容各种语言。
- 新一代即时编译器
HotSpot目前有两个即时编译器:编译耗时短输出代码优化程度低;编译耗时长输出代码优化质量高。融入Graal编译器,在保持输出相近质量代码的同时,开发效率和扩展性相较于前面提到的后者更佳。
- 向Native迈进
逐步开始支持提前编译(Java虚拟机加载这些已经预编译乘二进制库后可以直接调用,无需再等待即时编译器再运行时将其编译成二进制机器码)。需为不同操作系统编译对应的发行包。(Substrate VM了解一下)
- 灵活的胖子
HotSpot成为拥有越来越多开放性和扩展性,应对各种场景,联动外部功能的“胖子”
- 语言语法持续增强
6、实战
下载编译OpenJDK,在IDE中调试