带你读《Apache Tomcat的云原生演进》——GraalVM static compilation in web container application(1)https://developer.aliyun.com/article/1377535
2. 静态编译技术
基于以上的两个问题,是否有相应的解决办法呢?
那就回到我们今天的主题静态编译技术,它能够有效的帮助我们解决掉。
静态的反义词是动态的,刚才介绍的Java就是运行过程中动态的编译。如果看过一些英文资料,应该知道一个词叫AOT(Ahead of Time),即提前编译,它和静态编译是一个意思,只不过是不同的说法。所以静态编译技术就是在应用没有正式运行之前,对其进行编译处理,运行过程中我们就直接运行编译好的程序即可。
上图左侧中右半部分就是正常的JVM的运行方式,左半部分是Java Web应用采用了静态编译技术的运行方式。首先也是写一个Java的代码,但它没有编译的过程,它直接把Java程序通过静态编译成了一个Native Image的可执行文件。这个可执行文件和执行环境是强相关的,所以直接运行就可以了。
那么静态编译的输入是什么?
静态编译下,针对垃圾回收问题,如何解决?
如上图右侧所示,是一个静态编译的详细解读。最左侧是应用静态编译之前的输入,比如应用程序、应用程序依赖的三方库、JDK里的依赖、Substrate VM。
Substrate VM是静态编译中很重要的运行时,它包括静态的编译器、垃圾回收模块,比如GraalVM,它在之前的社区版本里,支持SerialGC的垃圾回收算法,商业化的支持G1。但在最新版本里,开源的社区版也支持G1垃圾收集器。
那么静态编译如何解决前面的两个问题的呢?
静态编译之后它就没有了JVM初始化的启动过程,也就是上图中红色的部分就没有了。解释执行和即时编译的部分也没有了,也就是浅绿色和的部分。即时编译的部分也没有了,它的内加载过程会比原来少很多,因为做了很多的编译优化。因此它一启动,执行的就是深绿色的部分,这样之前冷启动的问题就非常有效的解决了。
另外,静态编译后也不需要加载虚拟机,也不需要加载那么多的类了,因为它会利用静态编译,通过静态分析把和应用运行无关的类,剔除在最终可执行文件以外。把程序运行的过程中,只会把我们必须的内容编译到可执行文件里面来,让我们的运行内存得到有效的降低。
上图右侧是微服务的框架,在适配了静态编译之后,展示了在启动速度、运行时、内存占用方面的表现,可以看到提升还是非常大的。
带你读《Apache Tomcat的云原生演进》——GraalVM static compilation in web container application(3)https://developer.aliyun.com/article/1377533