QCon笔记~《天下武功,唯快不破——面向云原生应用的Java冷启动加速技术》 (2)

JWarmup:共享预热后的code cache,减小JIT开销
PGO AOT:增强的AOT技术,改进AOT的代码质量
Class Preinit:类预先初始化,降低运行时初始化类的开销

创新型——Graal VM静态编译技术

Graal VM是基于Java的开源高性能多语言运行平台,拥有高性能低内存占用的优点。

下图是Java编译技术的演进历史,蓝色部分运行在JVM中。

QCon笔记~《天下武功,唯快不破——面向云原生应用的Java冷启动加速技术》

我们的ByteCode字节码在解释执行的过程中,需要由JVM解释执行器边解释边执行,速度上当然最慢。

JIT,实时编译,当函数执行一定次数后就放到C1+C2的编译器中,之后这部分代码就不需要去解释执行了,但编译也是要耗费运行时间,速度也不容乐观。

AOT,先把一部分代码提前由jaotc编译好,在运行时就不需要解释执行这部分代码,但这部分代码在jaotc时拿不到VM runtime。

再激进就是静态编译技术,不再需要JVM,而是SVM提供运行时环境,直接将Bytecode转化为BinaryCode去执行。

QCon笔记~《天下武功,唯快不破——面向云原生应用的Java冷启动加速技术》

静态编译必须遵顼封闭性原则(the closed-world assumption)

所有运行时的信息都必须在编译时可见

两个基本问题

如何确定封闭的边界?

如何处理Java的动态特性?

如何在静态编译时确定运行状态,在C/C++中,数组的大小必须定义为一个常量,本质即编译时可见,对于Java反射调用的类如何去保障编译时可见。

QCon笔记~《天下武功,唯快不破——面向云原生应用的Java冷启动加速技术》

QCon笔记~《天下武功,唯快不破——面向云原生应用的Java冷启动加速技术》

针对反射的情况,Graal VM通过预执行给出了需要反射加载的类与方法,编译时填充到缓冲区RelectionData,并且将反射替换为直接方法调用,在运行时从缓存中查找执行。

一个大前提就是需要预执行去扫描这部分反射调用的对象方法,如果扫不到,就需要自己手动去添加配置。

关于性能报告的可以自己去查看大会PPT。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgwdzz.html