一些杂想:Java老矣,尚能饭否?

最近抽空看了Go、Rust等一些语言的新版本特性 , 还有云原生的一些基础设施( ,  ,  , Dapr , ) , 有点感慨Go真的是云原生的“一等公民” , 像是启动速度快、依赖少、内存占用少、 并发等无一不是击中Java的软肋 。然后突发奇想在上搜了下“Java老矣” , 能搜出520,000条结果 。不禁想问:Java真的老了吗?
“落寞”的Java
自1995年出生以来 , Java已经有27年历史了 , 曾经的风流雨打风吹去 , 一些优秀的设计在今天看来似乎并不那么重要甚至过时了 。比方说:
另一个广为诟病的是Java的资源占用问题 , 这主要包含两方面:静态的程序大小和动态的内存占用 。
Java的启动时间也是一大心病 , 主要原因在于启动时虚拟机初始化和大量类加载的时间开销(当然还有一个罪魁祸首是的bean初始化 , 我之前写了个异步初始化 Bean的 rhino-boot-turbo , 把串行改并行启动速度会快很多) 。本身镜像体积大 , 拉取时间就长 , 再加上分钟级的启动时间 , 部署应用就更显得慢了 。传统的企业应用更看重长时间运行的稳定性 , 重启和发布频率相对较低 , 对启动时间相对没那么敏感 , 然而对于需要快速迭代、水平扩展的微服务应用而言 , 更快的的启动速度就意味着更高的交付效率和更加快速的回滚 。尤其是对于应用或函数 , 冷启动速度至关重要 , 之前看AWS 函数允许最多运行5分钟 , 很难想象还要花一分钟时间先启动 。
云原生的潮流滚滚而来 , Java的这些缺陷在要求快速交付的大环境下显得格格不入 , 难怪Java与Go、Rust等原生语言相比 , 会显得“落寞”了 。
作为一个Java程序员 , 肯定想问 , Java还有机会吗?想起有位长者说过:一个人的命运啊 , 当然要靠自我的奋斗 , 另一方面 , 也要考虑历史的进程 。我想把它改成:Java的命运啊 , 当然要靠自身的努力 , 另一方面 , 也要考虑队友们给不给力 。
JDK的演进
我们的大部分系统都还跑在Java 8之上 , 因此作为开发同学对Java 8也是最熟悉的 。从Java 9开始 , JDK的版本号堪比版本狂魔涨得飞快 , 除去开发者能够肉眼感知的语法和API的变动()之外 , Java也在性能()上一直努力 。
我捋了一下官网[1]从Java 9开始的JEP列表 , 按照个人理解列出了关键的一些特性 。
Java 9:难产的模块化
在数次delay之后 , Java 9终于正式引入了Java平台模块系统(JPMS) , 项目代号 。在这之前 , Java以对代码进行组织 , 再将和资源打成Jar包 , 模块则在的概念上将多个逻辑上、功能上相关的包以及相关的资源文件封装成模块 。关于模块的详细介绍 , 可以参考下官方的介绍文档: Java 9 [2] 。
此前 , Java 的庞大臃肿一直为人诟病(一个rt.jar就有60多M , 整个JRE环境可以达到上百M) , 瘦身正是 的目标[3]之一 。此外 , 还有Jar Hell、安全性等等问题 。
不过模块化看着很好 , 也隐藏着陷阱:
对于新的项目 , 使用模块构建似乎是值得的 , 但现状是 , 大多数开发者会忽略模块系统 , 尤其是对于已经运行了多年的大型项目 , 改造的成本令人望而却步 。我猜测肯定会有人吐槽类似的问题: