一. 什么是 Java SE 与 Java EE(Jakarta EE)
Java 生态通常分为两个层次:Java SE(Standard Edition,标准版)与 Java EE(现更名为 Jakarta EE,企业版)。二者既有分工又有联系:SE 是基础语言与核心类库;EE 在 SE 之上提供企业级应用所需的规范与框架。
Java SE(Standard Edition)
1. 定义与定位
Java SE 是通用编程平台与标准库集合,是一切 Java 应用(桌面、服务器、移动、嵌入)的运行与开发基础。 它包含了支持 Java 应用程序开发和运行的核心类库以及虚拟机等核心组件,用于构建桌面应用程序或简单的服务器程序。
2. 核心组成(常见模块/包)
- 语言与运行时:
java.base(java.lang、java.util、集合框架、并发java.util.concurrent)、JVM、JIT、垃圾回收器。 - I/O 与网络:
java.io、java.nio、java.net、NIO2 文件与异步通道。 - 反射与模块:
java.lang.reflect、JPMS(Java Platform Module System,自 Java 9)。 - 并发与并行:锁/原子类、
ForkJoinPool、CompletableFuture。 - 安全:加密、证书、权限模型(
java.security)。 - 其他:JDBC(数据库连接基础 API)、
java.time、正则、国际化。 - GUI:Swing、JavaFX(后独立发布,现代较少使用)。
3. 典型使用场景
- 控制台/后端工具
- 桌面程序
- 算法与数据结构实现
- 网络编程
- 通用库开发
- 微服务运行基础(JVM & JDK)
4. 开发与运行
- 使用 JDK(工具链:
javac、java、jlink、jpackage、javadoc等)。 - 通过 JPMS 实现模块化,可用
jlink定制精简运行镜像。
Java EE / Jakarta EE(Enterprise Edition)
2019 年起,Java EE 移交至 Eclipse 基金会并更名为 Jakarta EE。理念未变:在 Java SE 之上定义一组企业级规范,由各服务器实现。
1. 定义与定位
Jakarta EE 是企业/分布式/事务应用的规范集合,抽象出标准接口,屏蔽底层容器差异,提升可移植性。
2. 核心规范(按层次)
- Web 层:Servlet、JSP/EL、WebSocket、JAX-RS(REST)。
- 业务层:CDI(依赖注入)、EJB(事务组件)、Bean Validation。
- 数据与事务:JPA(ORM)、JTA(分布式事务)。
- 消息与集成:JMS(消息队列)、JCA(连接器)。
- 安全与配置:Jakarta Security、Authentication、EE Config。
- 其他:JSON-P/JSON-B、Mail、Batch、Concurrency(EE 并发)、Web Profile/Full Profile。
3. 运行载体(应用服务器)
- 典型实现:WildFly / JBoss EAP、Payara / GlassFish、Open Liberty、TomEE 等。
- Web Profile:面向多数 Web 应用的子集(更轻量)。
- Compatibility:通过 TCK 认证,保证“同一规范、不同服务器”的可移植性。
4. 典型使用场景
- 声明式事务、安全、消息、批处理、JPA ORM、REST 的企业后端。
- 多团队协作、合规性与稳定性优先的传统企业系统。
二者关系与取舍
1. 依赖关系
Jakarta EE 建立在 Java SE 之上;EE 规范调用 SE 类库,运行于具备 EE 容器能力的服务器中。
2. 开发模型差异
- Java SE:自行选库、管理生命周期(
main方法),灵活但架构决策多。 - Jakarta EE:由容器管理组件生命周期(依赖注入、事务、资源池),以规范驱动减少厂商锁定。
3. 与 Spring 的关系
- Spring/Spring Boot 属于第三方生态,运行在 Java SE/Jakarta EE 容器之上(如 Tomcat、Jetty、Undertow)。
- 现代企业应用要么选 Jakarta EE(容器 + 规范),要么选 Spring(框架 + 生态),两者都基于 Java SE。
学习路径建议
1. 打牢 Java SE 基础
- 语法与面向对象
- 集合/泛型
- I/O/NIO
- 并发
- JVM/垃圾回收/性能调优
- 模块化、JDBC、
java.time、异常处理、JUnit 单元测试。
2. 进阶企业开发
- Jakarta EE 主线:Servlet → CDI → JPA/JTA → JMS/安全 → 应用服务器部署(WAR/EAR)。
- Spring 主线:Spring Core → MVC/WebFlux → Spring Data JPA → 事务与安全 → Spring Cloud。
常见打包与部署
- Java SE 应用:
jar(含/不含依赖)、jlink自定义镜像、GraalVM 原生镜像。 - Jakarta EE 应用:
- WAR:Web 应用(Servlet/REST)。
- EAR:大型企业应用(模块化结构)。
- 部署方式:部署至 EE 应用服务器,或通过 Docker/Kubernetes 容器化运行。
选择建议(实践角度)
- 偏工具/微服务/云原生:Java SE + 框架(如 Spring Boot 或轻量 JAX-RS + CDI + JPA)。
- 偏传统企业/合规系统:Jakarta EE(Web Profile/Full Profile,容器托管)。
- 考虑团队经验与生态:选用熟悉的技术栈,关注社区活跃度与维护成本。
易混点与纠正
- “Java EE 过时”:仅改名为 Jakarta EE,规范仍在演进。
- “EE 必须用 EJB”:现代 EE 多用 CDI + JTA + JPA 组合,EJB 非必需。
- “SE 做不了企业开发”:SE 是基础,企业能力取决于框架与架构设计。
对比一览表
| 维度 | Java SE | Java EE / Jakarta EE |
|---|---|---|
| 定位 | 基础语言与标准库 | 企业级规范集合(建立在 SE 之上) |
| 运行环境 | JRE/JDK、任意 JVM | EE 容器 / 应用服务器 |
| 编程模型 | 自主管理生命周期 | 容器管理(DI、事务、资源) |
| 关键能力 | 集合、并发、I/O、JDBC 等 | Servlet、CDI、JPA、JTA、JMS、Security、Batch |
| 打包方式 | JAR / 原生镜像 | WAR / EAR(部署至服务器) |
| 适用场景 | 工具、库、微服务基础 | 事务密集、集成复杂的企业系统 |
总结
- Java SE 是一切的根基,提供语言、JVM 与标准类库,是所有 Java 技术栈的核心。
- Jakarta EE(原 Java EE) 构建在 SE 之上,定义企业级规范(Web、事务、持久化、消息等),用于大规模分布式系统开发。
- 现代开发更注重轻量化与灵活性,可根据团队经验与系统需求,在 Java SE 基础上选择 Spring 生态 或 Jakarta EE 规范体系。
二. JVM , JDK , JRE 详解
一句话各自是啥
- JVM(Java Virtual Machine,Java 虚拟机):运行 Java 字节码的“执行引擎”。及虚拟机,负责类加载、执行(解释+JIT)、内存管理、垃圾回收、线程调度等。
- JRE(Java Runtime Environment,Java 运行时环境):运行 Java 程序所需的“最小运行时”。= JVM + 标准类库(
java.*/javax.*等)+ 基础运行工具(如java启动器)。 - JDK(Java Development Kit,Java 开发工具包):面向开发者的“完整工具箱”。= JRE + 编译/调试/打包/诊断工具(
javac、jar、javadoc、jdb、jlink、jpackage、jcmd、jfr…)。
直观关系:JDK ⊃ JRE ⊃ JVM
JVM(Java Virtual Machine)
它是什么
JVM 是运行 Java 字节码的虚拟机,屏蔽 OS/CPU 差异,让同一份 .class/.jar 跨平台运行(“一次编译,到处运行”的关键)。有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。字节码和不同系统的 JVM 实现是 Java 语言“一次编译,随处可以运行”的关键所在。
不同的语言,如Java ,Kotlin… ,通过各自的编译器编译成.class 文件,最终通过JVM 在不同的平台(Windows、Mac、Linux)上运行。
主要职责
- 类加载:加载
.class→ 验证/准备/解析 → 初始化(<clinit>)。 - 执行引擎:解释执行 + JIT(热点代码本地化)。
- 内存管理与 GC:自动分配/回收。
- 本地互操作:JNI 调用本地库。
核心组成(高频考点)
- 类加载子系统:启动/扩展/应用类加载器,双亲委派避免核心类被“假冒”。
- 运行时数据区(以 HotSpot 为例)
- 堆(Heap):对象与数组;通常分年轻代/老年代(Eden+S0/S1)。
- 方法区/元空间(Metaspace):类元数据、常量池;JDK 8 起使用本地内存。
- Java 栈(每线程):栈帧=局部变量表+操作数栈+返回地址。
- 程序计数器(PC)、本地方法栈(每线程)。
- 执行引擎:解释器、C1/C2 JIT 或 Graal;分层编译兼顾启动/峰值性能。
- 垃圾回收器:Serial、Parallel、CMS(历史)、G1、ZGC、Shenandoah。
GC 与调优只言片语
- 吞吐优先:Parallel GC。
- 延迟敏感:G1 / ZGC / Shenandoah。
- 常用参数:堆大小
-Xms/-Xmx、GC 选择-XX:+UseG1GC、日志-Xlog:gc*等。
JRE(Java Runtime Environment)
它是什么
JRE = JVM + 标准类库 + 基础工具,用于运行 Java 应用。是运行已编译Java 程序所需的环境。
用途与现状
- 适合“只运行、不开发”的场景。
- Java 11+:多数发行版不再单独提供 JRE 安装包;通常直接安装 JDK,或用
jlink从 JDK 定制最小运行镜像(JRE 概念更像“运行时镜像”)。
JDK(Java Development Kit)
它是什么
JDK = JRE + 开发工具链,是开发/编译/调试/打包的必备套件。是一个功能齐全的Java开发工具包,供开发者使用,用于创建和编译java 程序,包含JRE和一些工具。
常用工具
- 编译与打包:
javac(编译器)、jar(包)、javadoc(文档生成器) - 模块/镜像:
jdeps(依赖分析)、jlink(裁剪运行时)、jpackage(生成系统安装包) - 诊断/运维:
jcmd、jmap、jstack、jstat、jinfo、jconsole、JFR/JMC(Flight Recorder/Mission Control)
模块化(Java 9+)
- JDK 9 开始,不需要区分JDK和JRE的关系
- JPMS 将平台拆成模块(如
java.base),配合jlink按需打包,缩小体积、提升安全与可维护性。
三者关系与边界
层次与包含
- JVM:最核心的“执行引擎”。
- JRE = JVM + 标准类库:可运行的 Java 环境。
- JDK = JRE + 开发工具:面向开发/构建。
谁需要什么
- 运行应用:JRE/运行时镜像即可(现代生产多用
jlink定制或直接用 JDK 基础镜像)。 - 开发/编译:必须 JDK。
发行版与版本选择
常见发行版
- 参考实现 OpenJDK/HotSpot;商业/社区发行:Temurin(Adoptium)、Amazon Corretto、Azul Zulu、Microsoft Build of OpenJDK、Oracle JDK 等。
- 核心语言/类库/GC 实现一致(同版本线),主要差异在许可证、支持策略、补丁节奏与工具配套。
版本节奏(LTS)
- 典型 LTS:8、11、17、21(以及之后的 25…)。生产优先 LTS;非 LTS 用于试新特性/过渡。
实践建议:新项目优先 JDK 21 LTS,存量系统因依赖选择 17/11 并规划升级。
安装与环境配置
查看版本
java -versionjavac -version环境变量与多版本管理
- 设置 JAVA_HOME 指向 JDK 根目录;将
$JAVA_HOME/bin加入 PATH。 - 常用多版本工具:SDKMAN!(macOS/Linux)、jEnv、asdf;Windows 可用 scoop/choco 或 IDE 内置管理。
目录结构与常用命令(以 JDK 为例)
- 目录:
bin/:java、javac、jar、jcmd、jfr、jmap、jps、jstack…lib/:标准模块与内部资源(Java 9+ 模块化)
- 编译与运行:
javac Hello.javajava Hello或java -cp libs/*:. com.example.Main
- 模块/依赖分析:
jdeps your.jar - 生成精简运行镜像:
jlink --add-modules java.base,java.sql --output custom-runtime
- JFR 性能剖析:
- 启动:
-XX:StartFlightRecording=filename=app.jfr,duration=1m - 现场:
jcmd <pid> JFR.start/JFR.dump
- 启动:
版本兼容与编译目标
-
语言/字节码目标:
--release或-source/-target控制编译目标。- 例:在 JDK 21 上编译兼容 Java 17 运行时:
javac --release 17 …
📘 查看详细信息
一、什么是字节码(Bytecode)
字节码是一种中间代码(Intermediate Code),介于源代码与机器码之间。 当你编写程序(例如 Java、Python、C# 等)后,编译器不会直接将源代码编译为特定硬件平台的机器码,而是先编译成字节码。 这些字节码由虚拟机(如 Java 虚拟机 JVM、.NET CLR、Python 解释器等)解释或即时编译(JIT)执行。
举个例子:
- Java 程序:
.java文件 → 编译成.class文件(字节码) → JVM 执行。 - Python 程序:
.py文件 → 解释器生成.pyc文件(字节码) → Python 虚拟机执行。
二、采用字节码的好处
1. 跨平台性(Portability)
字节码的最大优势之一是**“一次编译,到处运行”**。 例如 Java 的 JVM 可以在 Windows、Linux、macOS 上运行相同的
.class文件,而不需要为每个平台重新编译。理由: JVM 负责将字节码转为不同平台的机器码,因此字节码本身与硬件体系无关。
2. 安全性(Security)
虚拟机执行字节码时,可以:
- 检查字节码是否合法(防止恶意代码执行非法操作);
- 限制访问系统资源(例如沙箱模型);
- 进行内存管理和异常处理。
这让运行字节码的程序比直接执行机器码更安全。
3. 高效的执行与优化
现代虚拟机通常内置 即时编译(JIT, Just-In-Time) 技术:
- 将频繁执行的字节码动态编译为本地机器码;
- 利用运行时信息进行优化(如内联、逃逸分析等);
- 在执行效率上接近甚至超过静态编译语言。
4. 便于移植与调试
字节码是一种结构化、可分析的中间形式:
- 它比机器码更容易反汇编与调试;
- 有助于代码分析、性能监控、热更新等。
5. 语言互操作性(Interoperability)
多个语言可以编译为同一种字节码并运行在同一个虚拟机上。 例如:
- Kotlin、Scala、Groovy 都可以编译成 JVM 字节码;
- C#、F#、VB.NET 都编译成 CLR 字节码。
这样可以让不同语言共享同一运行时和库生态。
三、总结
特性 说明 定义 源代码与机器码之间的中间代码,由虚拟机执行 执行环境 JVM、CLR、Python VM 等 主要优点 跨平台、安全性高、可优化、易调试、语言互通 典型应用 Java、Python、.NET、Kotlin 等语言 三、总结
特性 说明 定义 源代码与机器码之间的中间代码,由虚拟机执行 执行环境 JVM、CLR、Python VM 等 主要优点 跨平台、安全性高、可优化、易调试、语言互通 典型应用 Java、Python、.NET、Kotlin 等语言 如果你希望我举例展示 Java 或 Python 的字节码内容及其执行流程,我可以帮你生成具体代码示例。是否需要?
- 例:在 JDK 21 上编译兼容 Java 17 运行时:
-
前向/后向:classfile 版本 ≤ 运行时版本;否则会报 Unsupported class file version。
常见误区纠正
- “JVM = JDK” ❌:JVM 只负责执行;JDK 还含编译/调试/打包/诊断工具。
- “装了 JRE 就能编译” ❌:编译需要
javac等工具,只有 JDK 提供。 - “Java 11 以后没有 JRE 了” ❌:有“运行时”概念,但通常由
jlink定制,不再单独分发传统 JRE。 - “OpenJDK 比 Oracle JDK 慢” ❌:现代版本核心实现对齐,差异主要在授权/支持;性能通常不构成选型障碍。
- “有 GC 就不会内存泄漏” ❌:GC 只能回收不可达对象;错误引用/缓存仍会“逻辑泄漏”。
- “GC 越新越好” ❌:需结合吞吐/延迟/内存与业务模型择优;G1 通用稳妥,ZGC/She 适合极低停顿场景。
落地选型与实践要点
- 开发/本地调试:用 JDK LTS(17/21);熟悉
jcmd、jmap、jstack、JFR/JMC 做排障。 - 生产部署:
- 容器镜像优先选择官方/主流发行版的 headless 基础镜像。
- 设定
-Xms/-Xmx、选择 GC、开启-Xlog:gc*做观测与调优。 - 用
jlink生成仅含必需模块的自包含运行镜像,降低体积与攻击面;保留必要诊断工具(如jcmd/jfr)。
对比一览表
| 维度 | JVM | JRE | JDK |
|---|---|---|---|
| 核心作用 | 执行字节码 | 运行 Java 应用 | 开发/构建 Java 应用 |
| 是否含类库 | 否 | 是(标准类库) | 是(含 JRE + 工具) |
| 是否含工具链 | 否 | 否 | 是(编译/打包/诊断) |
| 主要受众 | 运行时本体 | 运维/仅运行者 | 开发者/构建者 |
| 典型命令 | — | java | java、javac、jar、jlink、jcmd… |
总结
- JVM:Java 的“引擎”,负责加载、执行与内存回收。
- JRE:JVM + 标准类库,提供运行环境。
- JDK:JRE + 开发工具,提供开发/构建能力。
- 生产优先 LTS + 主流发行版,结合
jlink精简与合适的 GC 选择,并用 JFR/JMC 持续观测与调优。 - 需要的话,我也可以按你的具体场景(桌面应用、微服务、数据处理、低延迟交易等)给出版本/GC/参数的定制清单。