深入理解JVM第三版笔记(3)-展望Java技术的未来

展望Java技术的未来

无语言倾向

每种语言有其适合和不适合的领域,Java要百尺杠头更进一步的话,似乎要放掉Java语言本身,无招胜有招.

2018年4月Oracel Labs 公开了一项黑科技Graal VM,它的口号是Run Programs Faster Anywhere,是一个在HotSpot虚拟机基础上增强的跨语言全栈虚拟机.它将多种语言的源码或者源码编译后的中间格式(如LLVM字节码)转化成能被Graal VM接受的中间表示(Intermediate Representation).

从更严格的角度看,Graal VM才是真正意义上与物理计算机相对应的高级语言虚拟机,理由是它与物理硬件的指令集一样,做到了只与机器特性相关而不与某种高级语言特性相关,

新一代即时编译器

HotSpot虚拟机中含有两个即时编译器,C1客户端编译器(编译耗时短但优化程度较低),C2服务器端编译器(编译耗时长但优化质量更高),它们会在分层编译机制于解释器配合共同构成HotSpot虚拟机的执行子系统.

C1优化热点,C2优化热点的热点.

自JDK10起,HotSpot中加入了一个全新的即时编译器,Graal编译器,它在保持输出相近质量的编译代码的同时,开发效率和扩展性上都要显著优于C2编译器,Graal编译器能做比C2更复杂的优化,如部分逃逸分析,也拥有比C2更加激进的预测性优化策略.Graal编译器尚且年幼,还未经过足够多的实践验证,仍然带着实验状态的标签,

向Native迈进

微服务化趋势下,Java启动时间长,需要预热才能达到高性能的特征有悖于这种场景.

跨进程,可面向用户程序的类型信息共享(Application Class Data Sharing)AppCDS,允许把加载后的类型信息缓存起来,从而提升下次启动速度,无操作垃圾收集器(Epsilon,只做内存分配而不做回收的收集器,对于运行完就退出的应用非常合适)等改善措施.

提前编译时相当于即时编译的概念,最大的好处是虚拟机加载这些预编译成二进制库后就能直接调用,无需在等待即时编译器在运行时将其编译成二进制码.理论上提前编译可以减少即时编译带来的预热时间,减少Java应用长期给人带来的第一次运行慢的不良体验,但它破坏了一次编写,到处运行的承诺,必须为每个不同的硬件,不同的操作系统去编译对应的发行包,也显著降低了Java链接过程的动态性.

Substrate VM的出现满足了人们对Java提前编译的全部期待.它是Graal VM 0.2版本中新出现的一个极小型的运行时环境,它能带来的好处是能显著降低内存占用和启动时间,采用指针分析技术,预分配堆内存,使之可以直接从目标程序开始运行,而无需进行Java虚拟机的初始化过程.

灵活的胖子

重构HotSpot,使之具有模块化的能力和足够的开放性,能在编译时指定一些列开关让编译输出的HotSpot虚拟机可以裁剪成不同的功能,例如支持哪些编译器,支持哪些收集器,是否支持JFR,AOT,CDS,NMT等,反映到源码不仅仅是条件编译,更关键的是接口与实现的隔离.

早在JDK1.4时代,就开放了虚拟机信息监控接口(JVM profiler interface JVMPI)与虚拟机调试接口(JVMDI)供运维和性能监控,IDE等外部工具使用,之后JVM Tool Interface完全整个了它们.

在JDK9时期,HotSpot开放了Java语言级别的编译器接口(JVM Compiler Interface)使得在Java虚拟机外部增加,替换即时编译器成为可能,它不侵入HotSpot代码,而增加或修改HotSpot虚拟机固有的功能逻辑提供了可行性.Graal编译器就是通过这个接口植入到HotSpot之中.

JDK10中,重构了JVMCI,有了这个接口才可能存在日后某个版本中CMS收集器退役,和JDK12中Shenandoah由其他厂商开发的垃圾收集器进入HotSpot的情况.

语言语法持续增强

自JDK7的Coins项目后,Java社区的创建了一个语法特性改进项目Amber,JDK10至13里提供的新语法基本来自于此.

posted @ 2020-04-16 20:42  柿子君  阅读(207)  评论(0)    收藏  举报