JVM1.8与1.9的区别是什么?
一、核心机制变化
- 类加载器调整
- JDK 1.8:使用三种类加载器:
- 启动类加载器(Bootstrap):加载核心类库(如
rt.jar
)。 - 扩展类加载器(ExtClassLoader):加载
JAVA_HOME/lib/ext
目录下的扩展类。 - 应用类加载器(AppClassLoader):加载
classpath
中的应用类。
- 启动类加载器(Bootstrap):加载核心类库(如
- JDK 1.9:
- 扩展类加载器被移除,替换为 平台类加载器(PlatformClassLoader),负责加载 JDK 模块化系统(JPMS)中的非核心模块(如
java.sql
)。 - 应用类加载器层级调整:父加载器变为平台类加载器,仅加载
classpath
中的类。
- 扩展类加载器被移除,替换为 平台类加载器(PlatformClassLoader),负责加载 JDK 模块化系统(JPMS)中的非核心模块(如
- JDK 1.8:使用三种类加载器:
- 模块化系统(JPMS)
- JDK 1.9 引入 Project Jigsaw,将 JDK 本身拆分为多个模块(如
java.base
、java.sql
),通过module-info.java
声明模块依赖,增强封装性和安全性。 - 影响:非公开模块无法直接访问,需显式声明依赖,解决传统
classpath
的复杂性问题。
- JDK 1.9 引入 Project Jigsaw,将 JDK 本身拆分为多个模块(如
二、语言与API特性
- Lambda与函数式编程
- JDK 1.8:首次引入 Lambda表达式 和 Stream API,支持函数式编程,简化集合操作。
- JDK 1.9:未新增函数式特性,但优化了接口私有方法(允许在接口中定义私有方法,提升代码复用性)。
- 集合工厂方法
- JDK 1.9:新增
List.of()
、Map.of()
等工厂方法,支持快速创建不可变集合,替代Collections.unmodifiable
的繁琐写法。
- JDK 1.9:新增
- 多版本兼容JAR(MVJAR)
- JDK 1.9:支持在单个JAR中兼容不同JDK版本的类文件,通过
META-INF/versions
目录实现,便于迁移旧代码。
- JDK 1.9:支持在单个JAR中兼容不同JDK版本的类文件,通过
三、工具与调试增强
- JShell(REPL工具)
- JDK 1.9:引入 JShell,支持交互式执行Java代码片段,无需定义类或
main
方法,提升调试效率。
- JDK 1.9:引入 JShell,支持交互式执行Java代码片段,无需定义类或
- Javadoc升级
- JDK 1.9:支持 HTML5格式 的API文档,增强可读性和搜索功能。
- 内存诊断工具
- JDK 1.9:新增
jcmd
命令,可实时诊断堆内存使用情况,优化问题排查流程。
- JDK 1.9:新增
四、垃圾回收器优化
- G1收集器成为默认
- JDK 1.8:默认使用 Parallel Scavenge + Parallel Old(注重吞吐量)或 CMS(低延迟)。
- JDK 1.9:默认切换为 G1收集器,通过区域化内存管理(Region)和优先级回收,平衡吞吐量与停顿时间。
- 内部优化
- JDK 1.9:改进G1的并行压缩算法,减少Full GC频率,提升大堆内存场景性能。
五、其他关键改进
- HTTP/2客户端:JDK 1.9引入标准化HTTP/2 API,替代遗留的
HttpURLConnection
,支持WebSocket。 - 进程API增强:新增
Process.getCurrentPid()
等方法,简化进程管理。 - 锁机制优化:改进锁争用策略,降低高并发场景下的性能损耗。
总结
特性 | JDK 1.8 | JDK 1.9 |
---|---|---|
类加载器 | ExtClassLoader加载扩展类 | 平台类加载器(PlatformClassLoader) |
模块化 | 无 | JPMS模块化系统 |
默认GC | Parallel/CMS | G1 |
新工具 | 无 | JShell、jcmd |
核心语言特性 | Lambda、Stream API | 接口私有方法、集合工厂方法 |
开发者建议:
- 升级必要性:若项目需模块化支持或低延迟GC,优先升级至JDK 1.9+;
- 兼容性注意:模块化系统可能影响旧代码访问内部API,需显式声明依赖。