3807 字
19 分钟
java相关知识点

一. 什么是 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.basejava.langjava.util、集合框架、并发 java.util.concurrent)、JVM、JIT、垃圾回收器。
  • I/O 与网络java.iojava.niojava.net、NIO2 文件与异步通道。
  • 反射与模块java.lang.reflect、JPMS(Java Platform Module System,自 Java 9)。
  • 并发与并行:锁/原子类、ForkJoinPoolCompletableFuture
  • 安全:加密、证书、权限模型(java.security)。
  • 其他:JDBC(数据库连接基础 API)、java.time、正则、国际化。
  • GUI:Swing、JavaFX(后独立发布,现代较少使用)。

3. 典型使用场景#

  • 控制台/后端工具
  • 桌面程序
  • 算法与数据结构实现
  • 网络编程
  • 通用库开发
  • 微服务运行基础(JVM & JDK)

4. 开发与运行#

  • 使用 JDK(工具链:javacjavajlinkjpackagejavadoc 等)。
  • 通过 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 SEJava EE / Jakarta EE
定位基础语言与标准库企业级规范集合(建立在 SE 之上)
运行环境JRE/JDK、任意 JVMEE 容器 / 应用服务器
编程模型自主管理生命周期容器管理(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 + 编译/调试/打包/诊断工具javacjarjavadocjdbjlinkjpackagejcmdjfr…)。

直观关系: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 JITGraal分层编译兼顾启动/峰值性能。
  • 垃圾回收器:Serial、Parallel、CMS(历史)、G1ZGCShenandoah

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(生成系统安装包)
  • 诊断/运维jcmdjmapjstackjstatjinfojconsoleJFR/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 CorrettoAzul ZuluMicrosoft Build of OpenJDKOracle JDK 等。
  • 核心语言/类库/GC 实现一致(同版本线),主要差异在许可证、支持策略、补丁节奏与工具配套

版本节奏(LTS)#

  • 典型 LTS:8、11、17、21(以及之后的 25…)。生产优先 LTS;非 LTS 用于试新特性/过渡。

实践建议:新项目优先 JDK 21 LTS,存量系统因依赖选择 17/11 并规划升级。


安装与环境配置#

查看版本#

Terminal window
java -version
javac -version

环境变量与多版本管理#

  • 设置 JAVA_HOME 指向 JDK 根目录;将 $JAVA_HOME/bin 加入 PATH
  • 常用多版本工具:SDKMAN!(macOS/Linux)、jEnvasdf;Windows 可用 scoop/choco 或 IDE 内置管理。

目录结构与常用命令(以 JDK 为例)#

  • 目录
    • bin/javajavacjarjcmdjfrjmapjpsjstack
    • lib/:标准模块与内部资源(Java 9+ 模块化)
  • 编译与运行
    • javac Hello.java
    • java Hellojava -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 的字节码内容及其执行流程,我可以帮你生成具体代码示例。是否需要?

  • 前向/后向classfile 版本 ≤ 运行时版本;否则会报 Unsupported class file version


常见误区纠正#

  1. “JVM = JDK” ❌:JVM 只负责执行;JDK 还含编译/调试/打包/诊断工具。
  2. “装了 JRE 就能编译” ❌:编译需要 javac 等工具,只有 JDK 提供。
  3. “Java 11 以后没有 JRE 了” ❌:有“运行时”概念,但通常由 jlink 定制,不再单独分发传统 JRE。
  4. “OpenJDK 比 Oracle JDK 慢” ❌:现代版本核心实现对齐,差异主要在授权/支持;性能通常不构成选型障碍。
  5. “有 GC 就不会内存泄漏” ❌:GC 只能回收不可达对象;错误引用/缓存仍会“逻辑泄漏”。
  6. “GC 越新越好” ❌:需结合吞吐/延迟/内存与业务模型择优;G1 通用稳妥,ZGC/She 适合极低停顿场景。

落地选型与实践要点#

  • 开发/本地调试:用 JDK LTS(17/21);熟悉 jcmdjmapjstackJFR/JMC 做排障。
  • 生产部署
    • 容器镜像优先选择官方/主流发行版的 headless 基础镜像。
    • 设定 -Xms/-Xmx、选择 GC、开启 -Xlog:gc* 做观测与调优。
    • jlink 生成仅含必需模块的自包含运行镜像,降低体积与攻击面;保留必要诊断工具(如 jcmd/jfr)。

对比一览表#

维度JVMJREJDK
核心作用执行字节码运行 Java 应用开发/构建 Java 应用
是否含类库是(标准类库)是(含 JRE + 工具)
是否含工具链是(编译/打包/诊断)
主要受众运行时本体运维/仅运行者开发者/构建者
典型命令javajavajavacjarjlinkjcmd

总结#

  • JVM:Java 的“引擎”,负责加载、执行与内存回收。
  • JRE:JVM + 标准类库,提供运行环境
  • JDK:JRE + 开发工具,提供开发/构建能力
  • 生产优先 LTS + 主流发行版,结合 jlink 精简与合适的 GC 选择,并用 JFR/JMC 持续观测与调优。
  • 需要的话,我也可以按你的具体场景(桌面应用、微服务、数据处理、低延迟交易等)给出版本/GC/参数的定制清单。
java相关知识点
https://fuwari.vercel.app/posts/java相关知识点/
作者
Kerwin
发布于
2025-10-28
许可协议
CC BY-NC-SA 4.0