Skip to content

Java 概述

什么是 Java

Java 是一门面向对象的编程语言,不仅吸收了 C++ 语言的各种优点,还摒弃了 C++ 里难以理解的多继承、指针等概念,因此 Java 语言具有功能强大和简单易用两个特征。Java 语言作为静态面向对象编程语言的优秀代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。

Java 语言的特点

  • 面向对象(封装,继承,多态)。
  • 平台无关性,平台无关性的具体表现在于,Java 是『一次编写,到处运行(Write Once,Run any Where)』的语言,因此采用 Java 语言编写的程序具有很好的可移植性,而保证这一点的正是 Java 的虚拟机机制。在引入虚拟机之后,Java 语言在不同的平台上运行不需要重新编译。
  • 支持多线程。C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持。
  • 编译与解释并存。

JDK 概述

JDK (Java Development Kit) 是 Java 语言的软件开发工具包(SDK),主要用于移动设备、嵌入式设备上的 Java 应用程序。JDK 是整个 Java 开发的核心,它包含了 JAVA 的运行环境(JVM+Java 系统类库)和 JAVA 工具。

JDK 官网 https://www.oracle.com/java/

JDK 版本号的选择

Oracle JDK 8u211 及以上版本进行具有商业用途(盈利目的)的应用或工具的开发时是要收费的。JDK8 最后一个免费版本,JDK 8u202。但推荐下载 JDK 8u201?!说好的最后一个免费版本,为什么写了两个版本号 8u201 和 8u202 呢?到底要用哪一个?

这就涉及到 Oracle 跟 Oracle JDK 的使用者之间的一个小小的约定或小常识了!下载奇数版本!!!

从 2014 年 10 月发布 Java SE 7 Update 71 (Java SE 7u71) 开始,Oracle 在发布 Oracle JDK 关键补丁更新 (CPUs:Critical Patch Updates) 的同时一般会发布相应的补丁集更新 (PSUs:Patch Set Updates)。那么 CPUs 和 PSUs 之间有什么区别呢?

  • Oracle JDK 关键补丁更新 (CPUs) 包含安全漏洞修复和重要漏洞修复,Oracle 强烈建议所有 Oracle JDK 用户及时升级到最新的 CPU 版本,Oracle JDK 关键补丁更新 (CPUs) 版本号采用奇数编号!
  • Oracle JDK 补丁集更新 (PSUs) 包含相应 CPUs 中的所有修复以及其他非重要修复,仅当您受到Oracle JDK关键补丁更新 (CPUs)版本之外的其他漏洞的影响时才应当使用相应的补丁集更新 (PSUs) ,Oracle JDK 补丁集更新 (PSUs) 版本号采用偶数编号!

所以,一般情况下只要下载奇数编号的最新版本更新就行了!但要记住:商业收费版本的不要用于商业用途!

Oracle JDK 与 Open JDK

Oracle JDK 是基于 Open JDK 源代码的商业版本。要学习 Java 新技术可以去 Open JDK 官网学习。JDK Enhancement Proposals(JDK 增强建议)。通俗的讲 JEP 就是 JDK 的新特性

Open JDK 官网:http://openjdk.java.net/

LST 版本

普通非 LTS 版本生命周期只有六个月,但 LTS(长期支持)版本会有多年的官方支持。目前主要关注的 LTS 版本:

版本发布时间类型支持状态
Java 82014-03LTS第三方厂商(Azul、Amazon Corretto)仍在维护
Java 112018-09LTSOracle 商业支持延长中
Java 172021-09LTS主流生产推荐版本之一
Java 212023-09LTS当前最新 LTS,推荐迁移目标
Java 252025-09LTS最新 LTS,2025年9月发布

如果关注这个领域的话,现在主流生产环境的迁移目标其实是 Java 21。Java 25 是更新的 LTS,但 21 已经有了相当大的生态积累,很多团队把它作为迁移目标。

Java 11 (2018 年发布,LTS)

  • 核心特性
    • 模块化系统 (JPMS),实现代码解耦与轻量化部署
    • 内置 HTTP Client API,替代老旧的 HttpURLConnection
    • ZGC 垃圾回收器 (实验性),暂停时间压至毫秒级
    • 移除 Java EE 和 CORBA 模块,精简 JDK 体积
  • 企业价值
    • 平衡稳定性和现代特性,适合传统企业系统升级
    • 官方支持至 2026 年,商业扩展支持可至 2027 年
    • 多数中间件和框架已全面兼容,迁移风险低

Java 17 (2021 年发布,LTS)

  • 核心特性
    • 密封类 (Sealed Classes),精确控制类继承边界,提升代码安全性
    • 模式匹配 (instanceof 优化),减少类型转换代码,提升可读性
    • 文本块 ("""),支持多行字符串,简化 SQL/JSON 等代码编写
    • ZGC 和 Shenandoah 垃圾回收器正式生产可用,亚毫秒级停顿
    • 强封装 JDK 内部 API,提升安全性
  • 企业价值
    • 性能显著提升:较 Java 11 吞吐量提升 23%,内存占用降低 15%
    • 支持周期长:官方支持至 2026 年 9 月,扩展支持至 2029 年 9 月
    • 生态全面支持:Spring Framework 6.0 和 Spring Boot 3.0 + 最低要求版本
    • 安全性增强:默认启用强封装,减少安全漏洞风险

Java 21 (2023 年发布,LTS)

  • 核心特性
    • 虚拟线程 (Virtual Threads),轻量级线程,大幅提升 I/O 密集型应用吞吐量
    • 分代 ZGC,优化内存管理,提升大堆场景性能
    • 字符串模板 (String Templates),简化字符串拼接,提升可读性和安全性
    • 记录模式 (Record Patterns) 和 switch 模式匹配,进一步简化数据处理代码
  • 企业价值
    • 高并发场景革命性提升:电商订单系统并发量从 1000 QPS 提升至 5000 QPS,延迟从 200 ms 降至 50 ms
    • 开发效率跃升:虚拟线程使并发编程门槛大幅降低,无需手动管理线程池
    • 支持周期最长:官方支持至 2028 年 9 月,扩展支持至 2031 年 9 月
    • 云原生友好:更小的内存占用,更快的启动速度,完美适配 K 8 s 环境

目前企业 Java 主流版本选择建议(更新于 2026.06.03)

目前企业 Java 开发中,除 Java 8 外,使用最多的是 Java 11,而综合来看最好的是 Java 17(2026 年主流选择),Java 21 则是未来高并发场景的趋势

  • 选择 Java 11 的场景
    • 传统金融 / 政府系统,对稳定性要求极高,短期内无法进行大规模升级
    • 正在从 Java 8 迁移的系统,需要一个平稳过渡的中间版本
    • 依赖的第三方库或中间件尚未完全支持 Java 17+
    • 预算有限,无法承担大规模重构成本的企业
  • 选择 Java 17 的场景(推荐大多数企业
    • 新建企业级项目,需要平衡稳定性和现代特性
    • 微服务架构,需要更好的性能和容器支持
    • 使用 Spring Boot 3.x 及以上版本的项目(强制要求)
    • 注重安全性和长期支持,希望减少未来升级频率
    • 希望获得显著性能提升而无需大幅修改代码的企业
  • 选择 Java 21 的场景
    • 高并发 I/O 密集型应用(Web 服务器、数据库访问、文件处理)
    • 微服务网关、实时通信系统(WebSocket 长连接)
    • 批处理系统,需要并行处理海量数据
    • 技术前瞻性企业,希望提前布局未来技术栈
    • 云原生环境,追求极致的资源利用率和弹性扩展能力

总结与行动建议

  • 使用最多:Java 11 目前仍占据约 45-50% 的市场份额,是企业从 Java 8 升级的首选过渡版本
  • 综合最好:Java 17 是当前最佳 LTS 版本,兼顾稳定性、性能、安全性和生态兼容性,支持周期长,适合大多数企业级开发
  • 未来趋势:Java 21 凭借虚拟线程等革命性特性,正在快速获得企业认可,特别是在高并发和云原生场景中

行动建议

  • 新项目:优先选择 Java 17,若涉及高并发 I/O 场景可考虑 Java 21
  • 现有 Java 8 项目:制定迁移计划,先迁移至 Java 11,再逐步升级到 Java 17
  • 现有 Java 11 项目:评估升级到 Java 17 的成本与收益,建议在 2026 年前完成升级
  • 关注 Java 21 生态发展,为未来高并发项目做好技术储备

windows 系统安装 JDK

JDK 变量环境配置

最好的配置方式:将位置切割成两段,一段用 JAVA_HOME 保存,一段用\bin 保存。如下例:

JAVA_HOME = C:\Program Files\Java\jdk1.8.0_91
%JAVA_HOME%\bin  相等于 --> C:\Program Files\Java\jdk1.8.0_91\bin

安装多个 JDK

安装过程都一样。只是配置环境变量时改动一下。分别将多个不同版本的 jdk 设置一个环境变量,然后最终让 JAVA_HOME 指定当前需要使用的版本的变量即可

JAVA_HOME_8 = D:\development\Java\jdk1.8.0_311
JAVA_HOME_11 = D:\development\Java\jdk-11.0.13
JAVA_HOME = %JAVA_HOME_8%

或者直接到 Path 变量修改对应的 %JAVA_HOME_{版本号}%\bin

JDK 11 手动生成 jre 目录

许多 java 软件的运行需要依赖 jre,但是在安装 jdk 11 后,发现 jdk 11 并没有自动安装 jre 环境。其实 jdk 11 的安装包里是自带 jre 的,只不过没有自动安装,手动安装一下就可以了。使用 cmd 命令行窗口进入 jdk 安装目录输入以下命令,即可生成 jre 目录:

bash
bin\jlink.exe --module-path jmods --add-modules java.desktop --output jre

注意事项

如果是安装版,请务必到以下位置删除这几个文件。(会默认指向最近安装的版本目录)

  • C:\Program Files (x86)\Common Files\Oracle\Java\javapath
  • C:\Program Files\Common Files\Oracle\Java\javapath

如果不删除上面这些文件,直接到环境变量PATH,将下面这些引用删除即可:

C:\Program Files\Common Files\Oracle\Java\javapath
C:\Program Files (x86)\Common Files\Oracle\Java\javapath
C:\ProgramData\Oracle\Java\javapath

Linux 系统安装 JDK

详见《Linux》相关的笔记

综合扩展

JRE、JDK、JVM 及 JIT 的区别

  • JRE(Java run-time) 是 Java 运行时环境,是运行 Java 程序所必须的。它是运⾏已编译 Java 程序所需的所有内容的集合,包括 Java 虚拟机(JVM),Java 类库,Java 命令和其他的⼀些基础构件。但是,它不能⽤于创建新程序。
  • JDK(Java development kit)是 Java 程序开发工具集。它拥有 JRE 所拥有的⼀切,还有 Java 编译器(javac)和⼯具(如 javadoc 和 jdb)。它能够创建和编译程序。
  • JVM(Java virtual machine)是 Java 虚拟机,它的责任是运行 Java 程序。针对不同系统的实现(Windows,Linux,macOS)不同的 JVM,因此 Java 语言可以实现跨平台。
  • JIT(Just In Time compilation)是即时编译。为了提高热点代码的执行效率,在运行时,当代码执行的次数超过一定的阈值时,虚拟机会将 Java 字节码转换为与本地平台相关的机器码,并进行各种层次的优化。如:主要的热点代码会被准换为本地代码,这样有利大幅度提高 Java 应用的性能。

javap 反编译工具(待整理)

参考:Java编程教程-理解javap工具

字节码

概述

所谓的字节码,就是 Java 程序经过编译之类产生的 .class 文件,字节码能够被虚拟机识别,从而实现 Java 程序的跨平台性。

Java 程序运行步骤

Java 程序从源代码到运行主要有三步:

  • 编译:将我们的代码(.java)编译成虚拟机可以识别理解的字节码(.class)
  • 解释:虚拟机执行 Java 字节码,将字节码翻译成机器能识别的机器码
  • 执行:对应的机器执行二进制机器码

只需要把 Java 程序编译成 Java 虚拟机能识别的 Java 字节码,不同的平台安装对应的 Java 虚拟机,这样就可以可以实现 Java 语言的平台无关性。

Java 语言“编译与解释并存”

高级编程语言按照程序的执行方式分为编译型解释型两种。

  • 编译型语言是指编译器针对特定的操作系统将源代码一次性翻译成可被该平台执行的机器码。
  • 解释型语言是指解释器对源程序逐行解释成特定平台的机器码并立即执行。

Java 语言既具有编译型语言的特征,也具有解释型语言的特征。因为由 Java 编写的程序需要先经过编译步骤,生成字节码(*.class 文件),这种字节码必须再经过 JVM,解释成操作系统能识别的机器码,在由操作系统执行。因此可以认为 Java 语言编译与解释并存。

Java 源程序与编译型运行区别:

I know where dry desert ends, green grass grows · MooN