深入理解java虚拟机-第一部分走进java
第一章 走进java
1.1 概述
java : NB
- 是一门机构严谨,面向对象 的语言
- 一次编译,到处运行 摆脱了平台的束缚
- 相对安全的 内存管理和内存访问机制 ,避免了大部分的内存泄漏和指针越界
- 热点代码检测和运行时编译 可以获得更高的性能
- 完善的开发环境以及第三方社区
- ...
1.2 java技术体系
JCP官方定义java技术体系:
- java程序设计语言
- java虚拟机
- class文件格式
- java类库API
JDK(java development kit)包括:1. java程序设计语言,2. java虚拟机,4. java类库API。java程序开发的最小环境
JRE(java runtime environment):2. java虚拟机,4. java类库API中的java SE API子集。支持java程序运行的标准环境
技术关注重点划分
- Java card :支持Java小程序 applet ,运行在小内存设备平台
- Java ME(Mico Edition): 支持java 运行在移动终端平台
- Java SE(Standard Edition): 支持面向桌面级应用平台
- Java EE(Enterprise Edition): 支持多层架构的企业级应用平台
1.3 java发展史
- 1995 java 1.0 write once,run anywhere
- 1996 jdk 1.0 , 提供了纯解释执行的 sun classic VM ,代表技术:java虚拟机,applet,AWT等
- 1997 jdk 1.1 许多基础技术支撑点 如:JDBC,代表技术:JAR文件格式,JDBC,JavaBeans,RMI等,java语法增强 内部类(Inner Class),反射(Reflection)
- 1998 jdk 1.2 sun把java技术体系拆分为三个方向 1.面向桌面应用开发的J2SE(java 2 platform,Standard Edition) 2.面向企业级开发的 J2EE(java 2 platform,Enterprise Edition) 3.面向手机等移动终端开发的 J2ME(java 2 platform,Micro Edition)。 代表技术:EJB,java plug-in,java IDL ,swing等. java虚拟机第一次内置了JIT(just in time) 即时编译器(classic VM,HotSpot VM,Exact VM) . 语言和API层面 添加了 starctfp关键字,以及collections类库
- 2000 jdk 1.3改进java类库
- 2002 jdk 1.4 代表技术:正则表达式,异常链,NIO,日志类,xml解析器等
- 2004 jdk 5 语法:自动装箱,泛型,动态注解,枚举,,可变长参数,foreach循环等。虚拟机:改进java内存模型(JMM ,java memory model),提供JUC(java.util.concurremt)并发包
- 2006 jdk 6 java EE,java ME,java SE ,提供初步动态语言支持,提供编译期注解处理器,对java虚拟机进行大量改进:锁与同步,垃圾收集,类加载等。
- 2009 jdk 7 提供G1收集器,加强对非java语言支持,可并行类加载架构
- 2014 jdk 8 lamada表达式,新的时间日期API,彻底移除HotSpot永久代
- 2017 jdk 9 Jigsaw发布,整顿HotSpot日志模块,增强若干工具
- 2018 jdk 10 统一源仓库,统一垃圾收集器接口,统一即时编译接口
- 2018 jdk 11 ZGC发布
- 2019 jdk 12 Shen-andoah垃圾收集器
1.4 java虚拟机家族
1.4.1 Sun Classic /Exact VM
Classic VM 纯解释器方式执行java代码
Exact VM 准确式内存管理(Exact Memory Management)虚拟机可以知道某个位置的数据是什么类型
1.4.2 HotSpot VM
目前使用范围最广的虚拟机
准确式内存管理,热点代码探测技术可以通过执行计数器找出最有编译价值的代码,然后通知即时编译器以方法为单位进行编译。如果方法被频繁调用或方法中有效循环次数很多分别会触发标准即时编译和栈上替换OSR On-Stack Replacement 行为
1.4.3 Mobile/Embedded VM
java ME 产品线虚拟机
1.4.4 BEA JRockit/IBM J9 VM
JRockit 专门为服务端高度优化的虚拟机,不注重程序启动速度,内部不包含解释器实现,全部代码都靠即时编译后执行,配套的垃圾收集器和故障处理套件
J9 全面考虑服务端、桌面、嵌入式等多用途,指责分离与模块化非常优秀,抽象封装出核心组件库
1.4.5 BEA Liquid VM / Azul VM
特定硬件平台绑定软硬件配合工作的专有虚拟机
1.4.6 Apache Harmony VM /Google Android Dalivk VM
虚拟机 非 java虚拟机
1.4.7 others
湮灭
1.5 展望java未来技术
机遇与挑战并存
1.5.1 无语言倾向
Graal VM 工作原理:将这些语言的源代码(如 JavaScript)或源代码编译后的中间格式(如 LLVM 字节码)通过解释器转换为能被Graal VM 接受的中间表示(IR)
1.5.2 新一代即时编译器
HotSpot 含有两个即时编译器,耗时短但输出代码优化程度较低的客户端编译器(简称C1)以及耗时长,但输出代码质量高的服务端编译器(简称C2)
JDK 10 新增即时编译器:Graal 编译器,C2替代者
1.5.3 向native迈进
微服务背景,单体应用变小 解决方法:逐步开始提前编译(AOT,Ahead Of Time Compilation) Substrate VM
1.5.4 灵活的胖子
HotSpot 经过一系列重构,逐渐从时间的侵蚀中挣脱。
1.5.5 语言语法逐渐增强
语言特性持续改进