第一部分 走进Java
第1章 走进Java
世界上并没有完美的程序,但我们并不因此而沮丧,因为写程序本来就是一个不断追求完美的过程。
JAVA的优点,摆脱了平台的束缚,实现了一次编写,到处运行。
1.2 Java技术体系
从广义上讲,Kotlin,Clojure,JRuby,Groovy等运行于JAVA虚拟上的编程语言都属于JAVA体系中的一员。
JavaEE,这条产品线在JDK6以前被称为J2EE,JDK10以后被Oracle放弃,捐献给Eclipse基金会,被称为Jakarta EE。
1.3 Java发展史
1991.4月,James Gosling博士的绿色计划开始。
1995.5.23,Oak改为Java。
1999.4.27,HotSpot虚拟机诞生。
2009.4.20,Oracle宣布Sun公司。
2014.3.18,JDK8发布,增加新功能,Lambda表达式支持,内置Nashorn JavaScript引擎支持,新的时间日期API,彻底移除HotSpot的永久代。
2018.9.25,JDK11发布,XGC革命性的垃圾收集器出现。
1.4 Java虚拟机家族
1.4.1 虚拟机始祖:Sun Classic/Exact VM
世界上第一款商用JAVA虚拟机。
JDK1.2之前是JDK中唯一的虚拟机。
JDK1.4完全退出商用虚拟机的历史舞台。
1.4.2 武林盟主:HotSpot VM
理所当然的成为全世界使用最广泛的JAVA虚拟机,是JAVA虚拟机家族中毫无争议的武林盟主.
1.4.3 小家碧玉:Mobile/Embedded VM
智能手机上的跨平台,国内的老人手机和出口到经济欠发达国家的供智能手机还在广泛使用这种更加简单,资源消耗更小的上一代JavaME虚拟机。
1.4.4 天下第二:BEA JRockit/IBM J9 VM
其他就不写了。
JavaInJava,元循环,证明一门语言可以自举,具有研究价值。
自己实现虚拟机就很合适。
Maxine VM,Jikes RVM也都是元循环虚拟机。
“自举”(Bootstrap)是一个核心概念,指系统通过自身或最小化的初始力量逐步构建更复杂功能的过程。这一术语源自短语“pull oneself up by one's bootstraps”(拽着鞋带把自己拉起来),比喻系统从简单起点实现自我升级的能力。
利用初始的简单能力,通过递归或迭代构建更复杂的系统。
经典比喻
- 启动过程:像用火柴点燃火种,再用火种生起篝火。
- 编译器自举:如同先用木头搭建梯子,再踩着木梯建造更坚固的金属梯子。
1.5 展望Java技术的未来
1.5.1 无语言倾向
2018年4月,公开了一项黑科技:Graal VM。
口号:"Run Programs Faster Anywhere"。
在任何地方都能更快地运行程序
Graal VM被官方称为"Universal VM",在HotSpot虚拟机上增强而成的跨语言全栈虚拟机,可以作为任何语言的运行平台使用。
工作原理是将源代码或编译后的中间格式LLVM字节码通过解释器转换为能被Graal VM接受的中间表示IR,例如设计一个解释器专门对LLVM输出的字节码进行转换来支持C和C++,此过程称为程序特化。
1.5.2 新一代即时编译器
HotSpot虚拟机包含两个即时编译器,编译耗时短单输出代码优化程度低的客户端编译器C1,编译时间长但代码优化程度高的客户端编译器C2。
JDK10起,加入全新即时编译器:Graal编译器。
1.5.3 向Native迈进
近几年从大型单体应用架构向小型微服务应用架构发展的技术潮流下,Java表现出来不适应,单体体积更小。
跨进程、面向用户程序的类型信息共享(Application Class Data Sharing,AppCDS),无操作垃圾收集器(Epsilon),提前编译(Ahead of Time Compilation,AOT)提供支持。
SubstrateVM极小型的运行时环境,包括独立的异常处理、同步调度、线程管理、内存管理和JNI访问。
1.5.4 灵活的胖子
HotSpot经过不断地添加新功能,以成长为会十八般武艺的身手灵活敏捷的胖子。
1.5.5 语言语法持续增强
JDK10中提供本地类型变量推断。
上面变量推断可以用在Lamdba中。
JDK13中提供实现switch语句的表达式支持。
JDK13中支持文本块功能,接收HTML,SQL场景中的大量+操作。
1.6 实战:自己编译JDK
要窥探Java虚拟机内部实现原理,最直接一条路径就是编译一套自己的JDK,通过阅读和跟踪调试JDK源码来了解Java技术体系运作。比阅读门槛高。
我们选择OpenJDK来进行编译实战。
1.6.1 获取源码
编译OpenJDK和OracleJDK,基本可以认为性能、功能和执行逻辑上都一样。
OpenJDK源码主页:OpenJDK
本次用OpenJDK12.
通过 https://hg.openjdk.java.net/jdk/jdk12获取源码
若无法科学上网,则打包出源码压缩包再下载吧。
点击菜单的"Browse"显示根目录页面,点击左边zip下载打包好的源码。
1.6.2 系统需求
尽量使用Linux或者MacOS构建OpenJDK。
留出2-4G内存,6-8G硬盘。
认真阅读源码中的doc/building.html文档。
尽量不要使用中文路径的文件夹。
1.6.3 构建编译环境
我没有作者说的环境,只有Windows系统。
后续补。。。