ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

JDK 深度解析

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 是什么JDKJava Development Kit是 Java 开发工具包包含了编译、运行、调试 Java 程序所需的全套工具和核心类库。简单来说写 Java 和跑 Java 都依赖它。JDK 不是一个单一的程序而是一个工具集合。它的核心价值在于提供了从源码到运行的完整工具链以及一套标准化的核心类库使得 Java 程序可以一次编写到处运行。二、核心组成2.1 编译器和运行时工具作用javacJava 编译器将 .java 源码编译成 .class 字节码文件javaJava 启动器启动 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等) (类库) (执行字节码)名称全称能力适用场景JVMJava Virtual Machine只负责运行字节码是一个抽象规范内嵌在 JRE 中不单独安装JREJava Runtime EnvironmentJVM 核心类库能运行 Java 程序只运行应用、不需要开发和诊断的机器JDKJava Development KitJRE 开发工具 诊断工具能开发和运行 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 JDKOracle 官方版本商用需要付费OpenJDK开源参考实现完全免费Eclipse TemurinEclipse 基金会维护的 OpenJDK 发行版免费推荐Amazon CorrettoAWS 维护的 OpenJDK 发行版免费长期支持Azul ZuluAzul 系统维护的 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:formatb,fileheap.hprof PID # 实时监控 GC jstat -gcutil PID 1000 # 多功能诊断推荐 jcmd PID Thread.print jcmd PID GC.heap_dump heap.hprof jcmd PID VM.system_properties4.5 JVM 基础参数启动 Java 应用时常见的 JVM 参数# 堆内存设置 -Xms2g -Xmx2g # 初始堆和最大堆生产环境建议设为相同值避免动态调整 # GC 选择Java 17 默认 G1Java 21 默认 G1可考虑 ZGC -XX:UseG1GC -XX:UseZGC # 低延迟 GC适合大堆和响应时间敏感的场景 # GC 日志 -Xlog:gc*:filegc.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 日志以便在出现问题时能够快速定位根因。
返回列表