Java 老矣, 尚能饭否
Posted on Sat 20 December 2025 in Journal
| Abstract | Journal on 2025-12-20 |
|---|---|
| Authors | Walter Fan |
| Category | learning note |
| Status | v1.0 |
| Updated | 2025-12-20 |
| License | CC-BY-NC-ND 4.0 |
概述
“Java 老矣,尚能饭否?”——这句灵魂拷问每隔几年就会在技术圈复读一次。
问的人一般很真诚:一边看着新语言在热榜起飞,一边盯着生产 JVM 不敢眨眼;一边嫌 Java “启动慢、内存大”,一边又庆幸它“稳定、生态强、好招人”。😄
我的结论很简单:Java 不仅还能饭,而且在“大模型应用开发(LLM App)”这条赛道上,反而更容易跑出“企业级的真落地”。
因为 LLM 应用最后拼的不是“谁写 prompt 更骚”,而是:
- 工程化:稳定性、降级、灰度、回放、可测性
- 集成:权限、数据、审计、业务流程、遗留系统
- 治理:成本、质量、合规、安全、可观测
这些恰恰是 Java 的传统强项区。
回顾 Java 的过去:它为什么能活这么久
Java 从 1995 年一路走来,几乎每个时代都能找到自己的位置:
- PC / 服务器时代:JVM + “一次编写到处运行”,把部署地狱砍掉一半。
- 企业系统时代:Servlet/JSP、Spring、各类中间件生态,撑起了“业务复杂度的大楼”。
- 移动时代:Android 让 Java 在客户端生态里也吃到红利(哪怕后来 Kotlin 上位,Java 仍然是基础设施)。
- 云原生时代:容器化之后,Java 被迫直面“启动慢、内存大”,开始长期自我改造:GC、JIT、类数据共享、框架瘦身、AOT/Native Image。
如果要用一句话总结 Java 的成功秘诀:
它不是“最酷的语言”,但它是“最能把复杂事情做成的语言之一”。
Java 的优点:
它不光库丰富、适合抽象、GC 好, 最重要的是有诸多 “工程上能用得上的优势”。
1) 软件库丰富:不是“库多”,是“可用的库多”
“生态丰富”这句话太轻了。更准确的说法是:Java 的生态成熟到可以把工程问题当成“常规题”来做。
- Web、DB、消息队列、缓存、配置、服务治理、可观测(日志/指标/追踪)……几乎都有行业标准答案。
- 更现实的一点:你能招到人。对于要维护 3~5 年的系统,招人成本往往比性能更致命。
2) 适合于抽象和组织复杂的业务逻辑:Java 天生适合“写规矩”
大模型应用的本质,往往不是“写一个 prompt 就结束”,而是把模型能力嵌进业务系统:
- 权限、审计、工单、风控、客服、知识库……
- 灰度、回滚、监控、报警、合规检查……
这类事情拼的是稳定的工程组织能力。Java 在这方面很顺手:
- 类型系统 + IDE 友好
- 规范化的依赖管理与测试体系
- 成熟的异常处理、日志规范与链路治理
3) GC 性能好:你嫌它重,它却很可靠
很多人吐槽 JVM “吃内存”,但 JVM 的运行时优化(JIT、逃逸分析、GC 策略等)也让它能在企业场景里长期稳定跑。
当系统做大以后,你会发现:
性能不是跑分,而是“可预测性 + 可调优空间”。
Java 的缺点:
1) 内存占用高:JVM 不是“语言”,更像“一个小操作系统”
JVM 自带运行时、类元数据、JIT 缓存、GC 结构……天生就比“裸奔二进制”胖。
当你把 Java 塞进容器里,就更明显:
- 你以为给了 512Mi 就够了
- JVM 以为你在开玩笑
- 然后 OOMKill 给你一记“现实教育”😄
实用建议:
- 先用指标说话:堆/非堆、RSS、GC Pause、分配速率,不要只盯着
-Xmx。 - 把启动参数当配置管理:用统一的基线模板,避免每个服务“手搓一套玄学参数”。
- 能瘦就瘦:依赖裁剪、减少反射、控制类加载、警惕大对象与缓存泄漏。
2) 启动速度慢:不是它不努力,是你想让它像脚本一样快
传统 JVM 的启动慢,来自:类加载、字节码验证、JIT 预热等。对于“秒级弹性伸缩”的场景,这确实是硬伤。
实用建议:
- 长跑服务(跑几天几周那种):启动慢通常不是第一优先级。
- 短生命周期服务(FaaS / 任务型):优先关注 AOT/Native Image 或轻量框架路线。
Java 的未来
你列的两个关键词很对:GraalVM 和 Spring AI。
我想把它们放进“大模型应用开发”的主线里讲清楚:Java 在 LLM 时代怎么发力。
1) 先把观念摆正:LLM 应用不是“训练模型”,而是“把模型用好”
现实世界里,绝大多数公司不会自己训大模型(成本、数据、人才都太硬核)。他们要的是:
- 把模型接进业务(API 调用、RAG、工具调用、工作流)
- 做好稳定性(限流、重试、熔断、降级、缓存)
- 做好治理(权限、审计、脱敏、合规)
- 做好可观测(成本、延迟、效果、失败率、幻觉率)
这是一场“工程化应用”的比赛。 Java 反而吃香。
2) Java 做 LLM 应用的黄金定位:企业系统的 AI 中间层
把 LLM 应用粗暴拆三层:
- 模型层:各种云模型/私有模型
- 编排层:Prompt、RAG、工具调用、评测与回放
- 业务层:权限、工单、订单、CRM、审计、监控
Java 最强的地方,是把 编排层 + 业务层 连在一起,并且连得很稳:
- 能和现有系统/数据/权限体系天然融合
- 可观测、可灰度、可审计
- 并发与吞吐足够可靠
3) 重点:Java 如何在大模型应用开发方面发力
3.1 把模型当“外部依赖服务”来治理(别当成魔法)
在 Java 世界里你早就熟悉“外部服务治理”:超时、重试、熔断、限流。
LLM 也一样,只是更贵、更慢、更不确定:
- 超时:别让一个请求拖垮线程池
- 重试:要带幂等与退避,否则会把成本放大
- 降级:贵模型失败 → 便宜模型;长答案 → 短答案
- 缓存与去重:同样的问题别重复烧钱
- 结构化输出:能 JSON 就别让它写散文(减少解析失败与“乱编”)
一句话:把“提示词工程”变成“可靠性工程”。
3.2 RAG:Java 的主场在“数据与权限”
企业做 RAG 最难的往往不是向量库,而是:
- 知识来源复杂(Wiki、工单、文档、代码、CRM)
- 权限复杂(不同部门、不同客户隔离)
- 审计复杂(谁问了什么、用了哪些文档、输出给了谁)
这类“脏活累活”,Java 生态做起来最顺:鉴权、隔离、审计、回放、合规检查。
3.3 工具调用(Tool Calling):让模型能办事,但也要可控
工具调用就是:模型决定调用哪个函数、传哪些参数,然后你的系统去执行。
这一步如果没治理好,分分钟从“AI 助手”变成“AI 破坏者”。
Java 的优势在于:
- 类型与校验:DTO + 校验框架,拒绝奇怪参数
- 权限校验:模型不等于用户,模型只是请求发起者
- 审计:每次工具调用必须可追踪
- 幂等与回滚:高风险操作必须有人类确认
4) 两个关键抓手:GraalVM 与 Spring AI
4.1 GraalVM:让 Java 更像云原生时代需要的样子
如果你的 LLM Gateway/编排服务需要更快启动、更小内存、更易弹性伸缩,AOT/Native Image 就值得关注。
它的意义不只是“跑得快”,而是让 Java 更适合“短生命周期 + 快速扩缩容”的运行模型。
4.2 Spring AI:让“接入模型”变成 Spring 风格的工程实践
Spring AI(以及类似的 Java LLM 框架)最大的价值,不是帮你写 prompt,而是提供:
- 标准化的模型调用抽象
- Provider 适配与配置体系
- 与 Spring Boot 的一致体验(配置、测试、可观测、依赖管理)
对企业团队来说,这种“工程一致性”非常值钱。
给程序员的落地路线图:怎么用 Java 把 LLM 真用起来
Step 1:先做一个 LLM Gateway(统一入口),再谈业务集成
目标:把“模型调用”变成一个可治理的内部服务。
- 输入:用户问题 + 场景 + 权限 + 上下文
- 输出:结构化结果(文本 + 引用 + 工具调用轨迹)
你应该第一天就加上的能力:
- 超时 + 重试 + 熔断 + 限流
- 结构化输出(JSON/Schema/约束提示)
- 缓存(Prompt+Context 的 hash key)
- 观测(token、延迟、失败率、provider 分布)
Step 2:再做 RAG——先“可引用”,再“会说话”
很多团队一开始追求“回答像人”,最后发现“回答像人也能胡说八道”。
正确顺序是:
- 先让回答 引用可追溯(必须带来源)
- 再优化表达(语气、格式、个性化)
Step 3:最后上工具调用——让模型能干活,但一定要“带刹车”
安全护栏建议直接做成 checklist:
- 白名单工具(只开放必要能力)
- 参数校验(拒绝非预期输入)
- 权限校验(谁能做什么)
- 审批与分级(高风险操作要人类确认)
结语:Java 老矣?老而弥坚。
Java 的“老”,很多时候是“经过生产环境拷打后的成熟”。
而大模型应用的主战场,恰恰不是“谁的语法更新潮”,而是:
谁能把 AI 能力稳定、可控、可审计地嵌进业务系统里。 🎯
所以问题不是“Java 能不能做 AI”,而是:
你准备好把 AI 当成一个真正的企业级能力来建设了吗?
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。