Java 8 最常被提到的是 Lambda、Stream 和新的时间 API,但它也带来了一些工具和 JVM 层面的变化。对日常工程来说,jdeps 和 Metaspace 比 jjs 更有长期价值:前者帮助分析依赖,后者改变了类元数据的内存管理方式。
jjs 是 Nashorn 的命令行入口
Java 8 带来了 Nashorn JavaScript 引擎,jjs 是它的命令行工具,可以直接执行 JavaScript 文件。
例如一个简单脚本:
function f() {
return 1;
}
print(f() + 1);
执行:
jjs func.js
会输出 2。
这个工具更像 Java 8 时代的实验性能力。今天看,它的工程价值已经有限,但它提醒我们:JDK 不只是语言和运行时,也包含一批诊断、分析和辅助工具。
jdeps 用来分析类和包依赖
jdeps 更实用。它可以分析 class、目录或 jar 包依赖了哪些包,哪些依赖在 classpath 上找不到。
例如:
jdeps app.jar
在升级 JDK、拆分模块、排查 jar 冲突时,jdeps 能快速回答几个问题:
- 这个 jar 依赖了哪些 JDK 包。
- 是否依赖了内部 API。
- 哪些第三方依赖缺失。
- 某个模块是否意外引用了不该引用的包。
它不能替代完整构建工具,但适合做静态依赖审计。
Metaspace 取代 PermGen
Java 8 中,类元数据从永久代 PermGen 转到了 Metaspace。对应 JVM 参数也发生变化:
- 旧参数:
-XX:PermSize、-XX:MaxPermSize - 新参数:
-XX:MetaspaceSize、-XX:MaxMetaspaceSize
Metaspace 默认使用本地内存,而不是 Java 堆里固定的一块永久代空间。这减少了很多老项目里 PermGen space 不够的问题,但不代表可以完全不管。
如果类加载持续增长,例如动态生成代理类、频繁热部署、类加载器泄漏,Metaspace 仍然可能持续上涨,最终触发 OOM。
升级时要关注工具链而不是只改语法
升级 Java 版本时,容易只看语言特性。实际工程里还要确认:
- 构建工具是否支持目标 JDK。
- IDE 和 CI 环境是否一致。
- 第三方依赖是否使用了不兼容的内部 API。
- JVM 参数是否仍然有效。
- 线上监控是否覆盖 Metaspace、线程、GC 和类加载数量。
Java 8 对很多团队来说是长期基线,理解这些工具和 JVM 变化,有助于后续升级到更高版本。
实用结论
jjs 是 Java 8 工具生态的一段历史,jdeps 是依赖分析的实用工具,Metaspace 则是 JVM 内存模型的重要变化。
学习 Java 版本特性时,不要只看语法糖。命令行工具、JVM 参数、类加载和监控指标,才是升级能不能平稳落地的关键。




