深入理解Java虚拟机
世界上并没有完美的程序,但我们并不因此而沮丧,因为写程序本来就是一个不断追求完美的过程。
当我们在使用一门技术时,不再依赖书本和他人就能得到这些问题的答案,那才算升华到了“不 惑”的境界。
走近Java
Java技术体系
Java程序设计语言
·各种硬件平台上的Java虚拟机实现
·Class文件格式 ·Java类库API
·来自商业机构和开源社区的第三方Java类库
我们可以把Java程序设计语言、Java虚拟机、Java类库这三部分统称为JDK(Java Development Kit),
-
ME
终端
-
SE
核心API
-
EE
企业级应用
1991年4月,由James Gosling博士领导的绿色计划(Green Project)开始启动,此计划最初的目标 是开发一种能够在各种消费性电子产品(如机顶盒、冰箱、收音机等)上运行的程序架构。这个计划 的产品就是Java语言的前身:Oak(得名于James Gosling办公室外的一棵橡树)。Oak当时在消费品市 场上并不算成功,但随着1995年互联网潮流的兴起,Oak迅速找到了最适合自己发展的市场定位并蜕 变成为Java语言。
JDK7->8
- lambda表达式
- 内置js引擎支持
- 新的时间、日期API
- 彻底移除HotSpot的永久代(方法区)heap+方法区JVM内存模型中对象生存的地方,转为元空间
…
不论如何,经过前后六轮投票,经历桌上桌下的斗争与妥协,Java没有分裂,JDK 9总算是带着 Jigsaw最终发布了,除了Jigsaw外,JDK 9还增强了若干工具(JS Shell、JLink、JHSDB等),整顿了 HotSpot各个模块各自为战的日志系统,支持HTTP 2客户单API等91个JEP。
Oracle的解决方案是顺理成章地终 结掉“每个JDK版本最少维护三年”的优良传统,从此以后,每六个JDK大版本中才会被划出一个长期 支持(Long Term Support,LTS)版,只有LTS版的JDK能够获得为期三年的支持和更新,普通版的 JDK就只有短短六个月的生命周期。JDK 8和JDK 11会是LTS版,再下一个就到2021年发布的JDK 17 了。
2018年9月25日,JDK 11发布,这是一个LTS版本的JDK,包含17个JEP,其中有ZGC这样的革命 性的垃圾收集器出现,也有把JDK 10中的类型推断加入Lambda语法这种可见的改进,但都比不过它发 布时爆出来的谣言轰动:“Java要开始收费啦!”
Oracle收购Sun是Java发展历史上一道明显的分界线。在Sun掌舵的前十几年里,Java获得巨大成 功,同时也渐渐显露出来语言演进的缓慢与社区决策的老朽;而在Oracle主导Java后,引起竞争的同时也带来新的活力,Java发展的速度要显著高于Sun时代。Java的未来是继续向前、再攀高峰,还是由盛 转衰、锋芒挫缩,你我拭目以待。
虚拟机
武林盟主:HotSpot VM
小家碧玉:Mobile/Embedded VM
天下第二:BEA JRockit/IBM J9 VM
软硬合璧:BEA Liquid VM/Azul VM
挑战者:Apache Harmony/Google Android Dalvik VM
没有成功,但并非失败:Microsoft JVM及其他
未来
- 无语言倾向
- 新一代即时编译器
- 向Native前进
- 灵活的胖子
- 语言语法持续增强
2018年4月,Oracle Labs新公开了一项黑科技:Graal VM,如图1-4所示,从它的口号“Run Programs Faster Anywhere”就能感觉到一颗蓬勃的野心,这句话显然是与1995年Java刚诞生时的“Write Once,Run Anywhere”在遥相呼应。
对Java而言,Graal VM本来就是在HotSpot基础上诞生的,天生就可作为一套完整的符合Java SE 8 标准的Java虚拟机来使用。它和标准的HotSpot的差异主要在即时编译器上,其执行效率、编译质量目 前与标准版的HotSpot相比也是互有胜负。但现在Oracle Labs和美国大学里面的研究院所做的最新即时 编译技术的研究全部都迁移至基于Graal VM之上进行了,其发展潜力令人期待。如果Java语言或者 HotSpot虚拟机真的有被取代的一天,那从现在看来Graal VM是希望最大的一个候选项,这场革命很可能会在Java使用者没有明显感觉的情况下悄然而来,Java世界所有的软件生态都没有发生丝毫变化, 但天下第一的位置已经悄然更迭。
直把软件服务作为重点领域的Java自然不可能对此视而不见,在最新的几个JDK版本的功能清 单中,已经陆续推出了跨进程的、可以面向用户程序的类型信息共享(Application Class Data Sharing,AppCDS,允许把加载解析后的类型信息缓存起来,从而提升下次启动速度,原本CDS只支 持Java标准库,在JDK 10时的AppCDS开始支持用户的程序代码)、无操作的垃圾收集器(Epsilon, 只做内存分配而不做回收的收集器,对于运行完就退出的应用十分合适)等改善措施。而酝酿中的一 个更彻底的解决方案,是逐步开始对提前编译(Ahead of Time Compilation,AOT)提供支持。
笔者将语言的功能特性和语法放到最后来讲,因为它是相对最不重要的改进点,毕竟连JavaScript 这种“反人类”的语法都能获得如此巨大的成功,而比Java语法先进优雅得多的挑战者C#现在已经“江湖 日下”,成了末路英雄
自己编译JDK
-
下载ZIP文件
https://gitee.com/isspark/OpenJDK12
-
解压
unzip -o -d /root/jdk/ isspark-OpenJDK12-master.zip
-
下载openjdk11
yum install java-11-openjdk-devel -y
-
配置
bash configure
出错:
configure: error: Could not find all X11 headers (shape.h Xrender.h Xrander.h XTest.h Intrinsic.h). You might be able to fix this by running 'sudo yum install libXtst-devel libXt-devel libXrender-devel libXrandr-devel libXi-devel'.
安装依赖
sudo yum install libXtst-devel libXt-devel libXrender-devel libXrandr-devel libXi-devel -y
再次执行
configure: error: Could not find cups! You might be able to fix this by running 'sudo yum install cups-devel'.
yum install cups-devel -y
接下去还会遇到不少依赖问题,跟着提示安装
结果:
A new configuration has been successfully created in /root/jdk/OpenJDK12/build/linux-x86_64-server-release using default settings. Configuration summary: * Debug level: release * HS debug level: product * JVM variants: server * JVM features: server: 'aot cds cmsgc compiler1 compiler2 epsilongc g1gc graal jfr jni-check jvmci jvmti management nmt parallelgc serialgc services shenandoahgc vm-structs zgc' * OpenJDK target: OS: linux, CPU architecture: x86, address length: 64 * Version string: 12.0.2-internal+0-adhoc.root.OpenJDK12 (12.0.2-internal) Tools summary: * Boot JDK: openjdk version "11.0.8" 2020-07-14 LTS OpenJDK Runtime Environment 18.9 (build 11.0.8+10-LTS) OpenJDK 64-Bit Server VM 18.9 (build 11.0.8+10-LTS, mixed mode, sharing) (at /usr/lib/jvm/java-11-openjdk-11.0.8.10-0.el7_8.x86_64) * Toolchain: gcc (GNU Compiler Collection) * C Compiler: Version 4.8.5 (at /usr/bin/gcc) * C++ Compiler: Version 4.8.5 (at /usr/bin/g++) Build performance summary: * Cores to use: 1 * Memory limit: 1819 MB
-
运行make
make image time make image
估计得花不少时间(我只分配了2颗核心 2G内存)
Stopping sjavac server
Finished building target ‘images’ in configuration ‘linux-x86_64-server-release’real 69m10.253s
user 49m10.483s
sys 6m52.374s
/root/jdk/OpenJDK12/build/linux-x86_64-server-release/jdk
看到了完整编译结果