欢迎光临
我们一直在努力

JDK 深度解析

在部署 Java 应用时,JDK 是最基础的依赖。但很多人对 JDK 的认知停留在"装了就能跑 Java"的层面,不清楚它的内部组成、JDK 与 JRE 的区别,以及运维场景下需要关注哪些点。本文系统梳理 JDK 的核心概念和实践要点

目录

一、JDK 是什么

二、核心组成

2.1 编译器和运行时

2.2 打包和文档工具

2.3 调试和诊断工具

2.4 核心类库

三、JDK、JRE、JVM 的区别

四、运维实践要点

4.1 版本选择

4.2 发行版选择

4.3 安装与环境变量

4.4 常用诊断命令

4.5 JVM 基础参数

五、总结


一、JDK 是什么

JDK(Java Development Kit)是 Java 开发工具包,包含了编译、运行、调试 Java 程序所需的全套工具和核心类库。简单来说,写 Java 和跑 Java 都依赖它。

JDK 不是一个单一的程序,而是一个工具集合。它的核心价值在于提供了从源码到运行的完整工具链,以及一套标准化的核心类库,使得 Java 程序可以"一次编写,到处运行"。

二、核心组成

2.1 编译器和运行时

工具

作用

javac

Java 编译器,将 .java 源码编译成 .class 字节码文件

java

Java 启动器,启动 JVM 并加载运行字节码

javap

反编译工具,查看 .class 文件的字节码和结构

2.2 打包和文档工具

工具

作用

jar

打包和解包 jar 文件,将多个 .class 和资源文件打包成一个可分发的单元

javadoc

根据源码中的注释生成 API 文档

jlink

模块化工具,创建自定义运行时镜像,减小部署体积

jdeps

依赖分析工具,分析类和模块的依赖关系

2.3 调试和诊断工具

这是运维人员最需要关注的部分,这些工具只有 JDK 才有,JRE 不包含:

工具

作用

jdb

命令行调试器

jstack

打印 Java 进程的线程栈,用于排查死锁、线程阻塞

jmap

导出堆转储文件,分析内存泄漏和对象分布

jstat

监控 JVM 统计信息,包括 GC、类加载、JIT 编译

jcmd

多功能诊断工具,JDK 8+ 推荐使用,可以替代 jstack、jmap 等

jconsole

图形化监控工具,查看内存、线程、GC 等实时信息

jvisualvm

更强大的图形化分析工具,支持性能分析和内存分析

2.4 核心类库

JDK 包含了 Java 标准库,从 Java 9 开始采用模块化设计(JPMS),核心类库被拆分为多个模块,其中最基础的是 java.base 模块,包含了 java.lang、java.util、java.io 等核心包。

三、JDK、JRE、JVM 的区别

这是 Java 领域最经典的概念区分,三者是包含关系:

JDK  ⊃  JRE  ⊃  JVM

开发工具   运行环境   虚拟机

(javac等)  (类库)    (执行字节码)

名称

全称

能力

适用场景

JVM

Java Virtual Machine

只负责运行字节码,是一个抽象规范

内嵌在 JRE 中,不单独安装

JRE

Java Runtime Environment

JVM + 核心类库,能运行 Java 程序

只运行应用、不需要开发和诊断的机器

JDK

Java Development Kit

JRE + 开发工具 + 诊断工具,能开发和运行 Java 程序

开发机、构建机、需要排查问题的服务器

一个常见的误区是认为服务器上只需要 JRE。理论上没错,但实际运维中强烈建议安装 JDK,因为一旦应用出现性能问题或内存泄漏,没有 jstack、jmap 这些工具就无法排查。而且从 JDK 11 开始,Oracle 不再单独提供 JRE 下载,OpenJDK 的很多发行版也只提供 JDK,直接装 JDK 已经是标准做法。

四、运维实践要点

4.1 版本选择

Java 版本分为 LTS(长期支持)和非 LTS。生产环境必须使用 LTS 版本:

• Java 8:仍在大量老旧系统中使用

• Java 11:广泛使用的 LTS 版本

• Java 17:当前主流 LTS 版本

• Java 21:最新 LTS 版本,支持虚拟线程

非 LTS 版本(如 9、10、12、13、14、15、16、18、19、20)只提供 6 个月支持,不适合生产环境。

4.2 发行版选择

JDK 有多个发行版,功能基本一致,主要区别在于许可协议和支持周期:

发行版

说明

Oracle JDK

Oracle 官方版本,商用需要付费

OpenJDK

开源参考实现,完全免费

Eclipse Temurin

Eclipse 基金会维护的 OpenJDK 发行版,免费,推荐

Amazon Corretto

AWS 维护的 OpenJDK 发行版,免费,长期支持

Azul Zulu

Azul 系统维护的 OpenJDK 发行版

生产环境推荐使用 Eclipse Temurin 或 Amazon Corretto,免费且有长期安全更新。

4.3 安装与环境变量

安装 JDK 后需要配置 JAVA_HOME 和 PATH 环境变量:

# 查看 Java 版本

java -version

javac -version

 

# 查找 Java 安装路径

which java

readlink -f $(which java)

 

# 配置环境变量(以 /usr/lib/jvm/java-17-openjdk 为例)

export JAVA_HOME=/usr/lib/jvm/java-17-openjdk

export PATH=$JAVA_HOME/bin:$PATH

在多版本环境中,可以使用 update-alternatives 管理默认 Java 版本,或者用 jenv、sdkman 等工具切换版本。

4.4 常用诊断命令

# 查看 Java 进程

jps -l

 

# 查看线程栈(排查死锁、线程阻塞)

jstack <PID> > thread_dump.txt

 

# 导出堆转储(排查内存泄漏)

jmap -dump:format=b,file=heap.hprof <PID>

 

# 实时监控 GC

jstat -gcutil <PID> 1000

 

# 多功能诊断(推荐)

jcmd <PID> Thread.print

jcmd <PID> GC.heap_dump heap.hprof

jcmd <PID> VM.system_properties

4.5 JVM 基础参数

启动 Java 应用时,常见的 JVM 参数:

# 堆内存设置

-Xms2g -Xmx2g          # 初始堆和最大堆,生产环境建议设为相同值避免动态调整

 

# GC 选择(Java 17 默认 G1,Java 21 默认 G1,可考虑 ZGC)

-XX:+UseG1GC

-XX:+UseZGC            # 低延迟 GC,适合大堆和响应时间敏感的场景

 

# GC 日志

-Xlog:gc*:file=gc.log:time,uptime,level,tags

 

# OOM 时自动导出堆转储

-XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=/var/log/heapdump/

五、总结

JDK 是 Java 生态的基石,它不仅仅是"运行 Java 的东西",而是一套包含编译、运行、调试、诊断、打包的完整工具链。理解 JDK、JRE、JVM 的区别,选择合适的版本和发行版,掌握 jstack、jmap、jstat 等诊断工具,是运维 Java 应用的基本功。

在生产环境中,建议始终安装完整的 JDK 而非 JRE,选择 LTS 版本和免费的 OpenJDK 发行版,并配置好 OOM 堆转储和 GC 日志,以便在出现问题时能够快速定位根因。

赞(0)
未经允许不得转载:171主机测评 » JDK 深度解析
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址