JVM1.8与1.9的区别是什么?

发布于:2025-09-03 ⋅ 阅读:(14) ⋅ 点赞:(0)

一、核心机制变化

  1. 类加载器调整
    • JDK 1.8:使用三种类加载器:
      • 启动类加载器(Bootstrap):加载核心类库(如 rt.jar)。
      • 扩展类加载器(ExtClassLoader):加载 JAVA_HOME/lib/ext 目录下的扩展类。
      • 应用类加载器(AppClassLoader):加载 classpath 中的应用类。
    • JDK 1.9:
      • 扩展类加载器被移除,替换为 平台类加载器(PlatformClassLoader),负责加载 JDK 模块化系统(JPMS)中的非核心模块(如 java.sql)。
      • 应用类加载器层级调整:父加载器变为平台类加载器,仅加载 classpath 中的类。
  2. 模块化系统(JPMS)
    • JDK 1.9 引入 Project Jigsaw,将 JDK 本身拆分为多个模块(如 java.basejava.sql),通过 module-info.java 声明模块依赖,增强封装性和安全性。
    • 影响:非公开模块无法直接访问,需显式声明依赖,解决传统 classpath 的复杂性问题。

二、语言与API特性

  1. Lambda与函数式编程
    • JDK 1.8:首次引入 Lambda表达式 和 Stream API,支持函数式编程,简化集合操作。
    • JDK 1.9:未新增函数式特性,但优化了接口私有方法(允许在接口中定义私有方法,提升代码复用性)。
  2. 集合工厂方法
    • JDK 1.9:新增 List.of()Map.of() 等工厂方法,支持快速创建不可变集合,替代 Collections.unmodifiable 的繁琐写法。
  3. 多版本兼容JAR(MVJAR)
    • JDK 1.9:支持在单个JAR中兼容不同JDK版本的类文件,通过 META-INF/versions 目录实现,便于迁移旧代码。

三、工具与调试增强

  1. JShell(REPL工具)
    • JDK 1.9:引入 JShell,支持交互式执行Java代码片段,无需定义类或 main 方法,提升调试效率。
  2. Javadoc升级
    • JDK 1.9:支持 HTML5格式 的API文档,增强可读性和搜索功能。
  3. 内存诊断工具
    • JDK 1.9:新增 jcmd 命令,可实时诊断堆内存使用情况,优化问题排查流程。

四、垃圾回收器优化

  1. G1收集器成为默认
    • JDK 1.8:默认使用 Parallel Scavenge + Parallel Old(注重吞吐量)或 CMS(低延迟)。
    • JDK 1.9:默认切换为 G1收集器,通过区域化内存管理(Region)和优先级回收,平衡吞吐量与停顿时间。
  2. 内部优化
    • 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,需显式声明依赖。

网站公告

今日签到

点亮在社区的每一天
去签到