随风
java曾经的确是风光无限,现在也依然热度不减。但眼下的java的确已经面临了严峻的挑战。java语言曾经的面向对象特性和虚拟机特性使得它非常适合大规模的上层应用,更重要的是它是跨平台的,一次编译,到处运行使得java空前成功。
java不是跨平台的第一人,但绝对是那个时代做到最优秀的。在开发简易程度和性能上做到了良好的平衡。但是令人想不到的是,随着科技的发展,那些曾经的独门武功竟然成了巨大的绊脚石。
jvm成就了java。jvm是一种hotspot虚拟机。如果你对jvm有所了解,你一定会惊叹它的博大精深和设计巧妙。jvm的存在,产生了一大批jvm语言,这是因为jvm其实是语言无关的。jvm语言著名的有kotlin,groovy和scala。你只需要实现字节码规范,你就可以驾驭jvm。这为jvm生态打下了坚实基础,同时jvm的jit编译器极大的改善了性能,使得java语言效率远高于python。jvm的线程模型也非常不错,这比python解析器可要高级得多。jvm还有出色的垃圾回收器,你可以用指令选择不同场景下的垃圾回收器。包括串行的,并行的。以及最新的g1垃圾回收器和zgc回收器。这些垃圾回收器已经满足绝大部分场景。基于最新的JDK15来看,“停顿时间不超过10ms”和“支持16TB的堆”这两个目标已经实现,并且官方明确指出JDK15中的ZGC不再是实验性质的垃圾收集器,而且建议投入生产了。
但是风水轮流转,云原生时代的到来,使得java瑟瑟发抖。那些引以为豪的优秀特性变得不再重要,首先是一次编译,到处运行。现在但凡新一点的语言,跨平台已经成为标配,而且不需要拖着一个沉重的jvm。加上docker的流行,环境已经不是什么问题了。在无服务器应用则更惨了,无服务器应用弹性伸缩,依赖于函数模块的快速启动,而jvm启动需要预热,因为jit需要一定的预热时间,加上类加载的设计。这一下好了,启动速度直接龟速。 如果写过springboot你一定对它的启动速度印象深刻。隔壁go语言的启动简直是快如闪电啊。第三就是面向对象机制,使其适合大规模的编程,可惜随着微服务的流行,人们已经不再追求巨石应用,而是切分成一个个小应用。java冗长的语法,怎么比得过函数式的程序语言呢。最后是高并发场景,这是java当年的强项。java凭借着优秀的高并发支持而流行。但是如今它一对一的线程模型加上各种复杂的锁机制,导致新手根本无法上手。而隔壁nodejs根本就是单线程加事件循环,实现了巨大的吞吐量,不需要锁机制,加上js天生容易掌握,java再次完败。
但是java是否就此停止挣扎了呢,当然不可能。java世界看到了威胁,正开始准备一个超级大招-graalvm。有了它我们就不需要jvm这个累赘了。https://www.graalvm.org/
graalvm的官网映入眼帘的就是高性能,云原生,多种语言。下面排着各种语言的logo。这不免让人疑惑,难道它所有语言都支持。不错,它几乎全支持我们常见的语言,这使得我们多种语言互操作变得十分简单。它最重要的功能当然就是解决java的弊端。它实现的java编译为本地二进制代码。双击就能够运行。从而实现了高速启动,使得Java不至于在云原生时代无所适从。配合springnative,你就能实现java云原生场景的快速启动。
graalvm 的设计是令人惊叹的,java不是一种满足封闭原则的语言,它带有很强的动态性。如类加载机制。这些难以通过静态编译实现,但是 graalvm 有自己的独门武功,可以通过多次运行辅助分析出程序里的动态部分。限于篇幅,这里就不再赘述了。
这篇文章涉及到了较多的新名词,但只要阅读了cwl公众号的那篇云计算时代的文章应该还是对这些新名词有一定了解的。这里立一个flag,下篇文章带大家实操 graalvm ,体验一下云原生java的魅力。
最后来个传送门