一、引言:为什么需要理解这三者的区别?
1.1 一个初学者的困惑
很多Java初学者在配置开发环境时都会遇到这样的困惑:官网上有JDK下载、有JRE下载,还有人在讨论JVM调优。这三者到底是什么关系?为什么有时候安装了JDK就不需要单独安装JRE了?为什么Java 11之后Oracle官网似乎找不到独立的JRE下载了?
这些问题看似基础,却关乎你对Java平台底层运行机制的真正理解。许多工作了三四年的Java程序员,被面试官问到"请描述一下JVM的内存模型"或者"JDK和JRE的区别是什么"时,回答得磕磕绊绊。这并不是因为他们不够聪明,而是因为他们在学习和工作中从来没有系统地梳理过这些概念。
#mermaid-svg-pYYUM4mUFJXrCuZl{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-pYYUM4mUFJXrCuZl .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-pYYUM4mUFJXrCuZl .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-pYYUM4mUFJXrCuZl .error-icon{fill:#552222;}#mermaid-svg-pYYUM4mUFJXrCuZl .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-pYYUM4mUFJXrCuZl .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-pYYUM4mUFJXrCuZl .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-pYYUM4mUFJXrCuZl .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-pYYUM4mUFJXrCuZl .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-pYYUM4mUFJXrCuZl .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-pYYUM4mUFJXrCuZl .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-pYYUM4mUFJXrCuZl .marker{fill:#333333;stroke:#333333;}#mermaid-svg-pYYUM4mUFJXrCuZl .marker.cross{stroke:#333333;}#mermaid-svg-pYYUM4mUFJXrCuZl svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-pYYUM4mUFJXrCuZl p{margin:0;}#mermaid-svg-pYYUM4mUFJXrCuZl .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-pYYUM4mUFJXrCuZl .cluster-label text{fill:#333;}#mermaid-svg-pYYUM4mUFJXrCuZl .cluster-label span{color:#333;}#mermaid-svg-pYYUM4mUFJXrCuZl .cluster-label span p{background-color:transparent;}#mermaid-svg-pYYUM4mUFJXrCuZl .label text,#mermaid-svg-pYYUM4mUFJXrCuZl span{fill:#333;color:#333;}#mermaid-svg-pYYUM4mUFJXrCuZl .node rect,#mermaid-svg-pYYUM4mUFJXrCuZl .node circle,#mermaid-svg-pYYUM4mUFJXrCuZl .node ellipse,#mermaid-svg-pYYUM4mUFJXrCuZl .node polygon,#mermaid-svg-pYYUM4mUFJXrCuZl .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-pYYUM4mUFJXrCuZl .rough-node .label text,#mermaid-svg-pYYUM4mUFJXrCuZl .node .label text,#mermaid-svg-pYYUM4mUFJXrCuZl .image-shape .label,#mermaid-svg-pYYUM4mUFJXrCuZl .icon-shape .label{text-anchor:middle;}#mermaid-svg-pYYUM4mUFJXrCuZl .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-pYYUM4mUFJXrCuZl .rough-node .label,#mermaid-svg-pYYUM4mUFJXrCuZl .node .label,#mermaid-svg-pYYUM4mUFJXrCuZl .image-shape .label,#mermaid-svg-pYYUM4mUFJXrCuZl .icon-shape .label{text-align:center;}#mermaid-svg-pYYUM4mUFJXrCuZl .node.clickable{cursor:pointer;}#mermaid-svg-pYYUM4mUFJXrCuZl .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-pYYUM4mUFJXrCuZl .arrowheadPath{fill:#333333;}#mermaid-svg-pYYUM4mUFJXrCuZl .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-pYYUM4mUFJXrCuZl .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-pYYUM4mUFJXrCuZl .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pYYUM4mUFJXrCuZl .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-pYYUM4mUFJXrCuZl .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pYYUM4mUFJXrCuZl .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-pYYUM4mUFJXrCuZl .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-pYYUM4mUFJXrCuZl .cluster text{fill:#333;}#mermaid-svg-pYYUM4mUFJXrCuZl .cluster span{color:#333;}#mermaid-svg-pYYUM4mUFJXrCuZl div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-pYYUM4mUFJXrCuZl .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-pYYUM4mUFJXrCuZl rect.text{fill:none;stroke-width:0;}#mermaid-svg-pYYUM4mUFJXrCuZl .icon-shape,#mermaid-svg-pYYUM4mUFJXrCuZl .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pYYUM4mUFJXrCuZl .icon-shape p,#mermaid-svg-pYYUM4mUFJXrCuZl .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-pYYUM4mUFJXrCuZl .icon-shape .label rect,#mermaid-svg-pYYUM4mUFJXrCuZl .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pYYUM4mUFJXrCuZl .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-pYYUM4mUFJXrCuZl .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-pYYUM4mUFJXrCuZl :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 新手常见困惑
JDK和JRE有什么区别?
JVM到底是什么?
为什么装JDK就能运行程序?
Oracle JDK vs OpenJDK选哪个?
JDK各版本JRE变化?
本质:开发工具 vs 运行环境
本质:跨平台的核心引擎
原因:JDK包含JRE
取决于使用场景和合规要求
版本演进:JDK 11后不再独立发布JRE
1.2 学完本文你将会理解
读完这篇文章,你将能够:
- 清晰地描述JDK、JRE、JVM各自是什么、各自包含哪些组件
- 画出三者之间的包含关系图,并用准确的语言解释
- 完整地描述一段Java程序从源码到执行的每一步过程
- 深入理解JVM的内部架构(类加载器、运行时数据区、执行引擎等)
- 区分Oracle JDK、OpenJDK和其他发行版的差异
- 了解JDK/JRE打包方式在各个版本中的历史变化
- 根据实际需求选择合适的JDK版本和发行版进行安装
二、JDK:Java开发工具包
2.1 什么是JDK?
**JDK(Java Development Kit,Java开发工具包)**是Java平台最顶层的概念,是提供给Java开发者使用的完整软件开发工具包。它包含了Java程序开发、调试、运行所需的一切工具和资源。
如果把Java开发比作建造一栋房子,那么JDK就是你手中的全套工具箱------里面不仅有锤子和钉子(编译器),还有测量尺(调试工具)、施工图纸查看器(文档工具)以及一个可以预览房屋效果的展示间(运行环境)。JDK是Java开发者的"瑞士军刀"。
2.2 JDK的核心组件
JDK由以下几个核心部分组成:
#mermaid-svg-sKVlX2dnQ9jGECS4{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-sKVlX2dnQ9jGECS4 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-sKVlX2dnQ9jGECS4 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-sKVlX2dnQ9jGECS4 .error-icon{fill:#552222;}#mermaid-svg-sKVlX2dnQ9jGECS4 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-sKVlX2dnQ9jGECS4 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-sKVlX2dnQ9jGECS4 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-sKVlX2dnQ9jGECS4 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-sKVlX2dnQ9jGECS4 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-sKVlX2dnQ9jGECS4 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-sKVlX2dnQ9jGECS4 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-sKVlX2dnQ9jGECS4 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-sKVlX2dnQ9jGECS4 .marker.cross{stroke:#333333;}#mermaid-svg-sKVlX2dnQ9jGECS4 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-sKVlX2dnQ9jGECS4 p{margin:0;}#mermaid-svg-sKVlX2dnQ9jGECS4 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-sKVlX2dnQ9jGECS4 .cluster-label text{fill:#333;}#mermaid-svg-sKVlX2dnQ9jGECS4 .cluster-label span{color:#333;}#mermaid-svg-sKVlX2dnQ9jGECS4 .cluster-label span p{background-color:transparent;}#mermaid-svg-sKVlX2dnQ9jGECS4 .label text,#mermaid-svg-sKVlX2dnQ9jGECS4 span{fill:#333;color:#333;}#mermaid-svg-sKVlX2dnQ9jGECS4 .node rect,#mermaid-svg-sKVlX2dnQ9jGECS4 .node circle,#mermaid-svg-sKVlX2dnQ9jGECS4 .node ellipse,#mermaid-svg-sKVlX2dnQ9jGECS4 .node polygon,#mermaid-svg-sKVlX2dnQ9jGECS4 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-sKVlX2dnQ9jGECS4 .rough-node .label text,#mermaid-svg-sKVlX2dnQ9jGECS4 .node .label text,#mermaid-svg-sKVlX2dnQ9jGECS4 .image-shape .label,#mermaid-svg-sKVlX2dnQ9jGECS4 .icon-shape .label{text-anchor:middle;}#mermaid-svg-sKVlX2dnQ9jGECS4 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-sKVlX2dnQ9jGECS4 .rough-node .label,#mermaid-svg-sKVlX2dnQ9jGECS4 .node .label,#mermaid-svg-sKVlX2dnQ9jGECS4 .image-shape .label,#mermaid-svg-sKVlX2dnQ9jGECS4 .icon-shape .label{text-align:center;}#mermaid-svg-sKVlX2dnQ9jGECS4 .node.clickable{cursor:pointer;}#mermaid-svg-sKVlX2dnQ9jGECS4 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-sKVlX2dnQ9jGECS4 .arrowheadPath{fill:#333333;}#mermaid-svg-sKVlX2dnQ9jGECS4 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-sKVlX2dnQ9jGECS4 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-sKVlX2dnQ9jGECS4 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sKVlX2dnQ9jGECS4 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-sKVlX2dnQ9jGECS4 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sKVlX2dnQ9jGECS4 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-sKVlX2dnQ9jGECS4 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-sKVlX2dnQ9jGECS4 .cluster text{fill:#333;}#mermaid-svg-sKVlX2dnQ9jGECS4 .cluster span{color:#333;}#mermaid-svg-sKVlX2dnQ9jGECS4 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-sKVlX2dnQ9jGECS4 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-sKVlX2dnQ9jGECS4 rect.text{fill:none;stroke-width:0;}#mermaid-svg-sKVlX2dnQ9jGECS4 .icon-shape,#mermaid-svg-sKVlX2dnQ9jGECS4 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sKVlX2dnQ9jGECS4 .icon-shape p,#mermaid-svg-sKVlX2dnQ9jGECS4 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-sKVlX2dnQ9jGECS4 .icon-shape .label rect,#mermaid-svg-sKVlX2dnQ9jGECS4 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sKVlX2dnQ9jGECS4 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-sKVlX2dnQ9jGECS4 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-sKVlX2dnQ9jGECS4 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} JDK - Java Development Kit
JRE - Java Runtime Environment
开发工具集 Development Tools
JVM - Java Virtual Machine
核心类库 Core Libraries
其他运行时组件
javac - 编译器
java - 应用启动器
jar - 打包工具
javadoc - 文档生成器
jshell - 交互式命令行
javap - 反编译工具
jdb - 调试器
jstatd - JVM监控
keytool - 密钥管理
jarsigner - 签名工具
2.3 主要开发工具详解
下面通过一张表来系统地了解JDK中每个开发工具的用途:
| 工具 | 全称 | 功能说明 | 使用示例 |
|---|---|---|---|
| javac | Java Compiler | 将.java源文件编译为.class字节码文件 | javac Hello.java |
| java | Java Launcher | 启动JVM并执行Java字节码程序 | java Hello |
| jar | Java Archive Tool | 将多个.class文件打包为.jar归档文件 | jar cvf app.jar *.class |
| javadoc | Java Documentation Generator | 从源码注释中生成HTML格式的API文档 | javadoc -d doc Hello.java |
| jshell | Java Shell | Java的交互式REPL环境(JDK 9+) | jshell |
| javap | Java Class File Disassembler | 反编译.class文件,查看字节码指令 | javap -c Hello.class |
| jdb | Java Debugger | 命令行调试工具 | jdb Hello |
| jps | JVM Process Status | 列出当前系统中所有JVM进程 | jps -l |
| jstat | JVM Statistics Monitoring | 监控JVM的垃圾回收、类加载等统计信息 | jstat -gc 1234 |
| jmap | Java Memory Map | 生成堆内存快照、查看内存使用详情 | jmap -heap 1234 |
| jstack | Java Stack Trace | 打印线程的堆栈信息 | jstack 1234 |
| jconsole | Java Monitoring Console | 图形化的JVM监控工具 | jconsole |
| keytool | Key and Certificate Tool | 管理密钥和数字证书 | keytool -genkey -alias mykey |
| jarsigner | JAR Signer | 对JAR文件进行数字签名验证 | jarsigner -verify app.jar |
2.4 重点工具深入说明
javac编译器是整个JDK中最核心的开发工具。它的工作是将人类可读的Java源代码(.java文件)编译成JVM可以理解的字节码格式(.class文件)。编译过程分为以下几个步骤:
#mermaid-svg-YtnA9xy5HDv29mys{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-YtnA9xy5HDv29mys .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-YtnA9xy5HDv29mys .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-YtnA9xy5HDv29mys .error-icon{fill:#552222;}#mermaid-svg-YtnA9xy5HDv29mys .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-YtnA9xy5HDv29mys .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-YtnA9xy5HDv29mys .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-YtnA9xy5HDv29mys .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-YtnA9xy5HDv29mys .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-YtnA9xy5HDv29mys .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-YtnA9xy5HDv29mys .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-YtnA9xy5HDv29mys .marker{fill:#333333;stroke:#333333;}#mermaid-svg-YtnA9xy5HDv29mys .marker.cross{stroke:#333333;}#mermaid-svg-YtnA9xy5HDv29mys svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-YtnA9xy5HDv29mys p{margin:0;}#mermaid-svg-YtnA9xy5HDv29mys .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-YtnA9xy5HDv29mys .cluster-label text{fill:#333;}#mermaid-svg-YtnA9xy5HDv29mys .cluster-label span{color:#333;}#mermaid-svg-YtnA9xy5HDv29mys .cluster-label span p{background-color:transparent;}#mermaid-svg-YtnA9xy5HDv29mys .label text,#mermaid-svg-YtnA9xy5HDv29mys span{fill:#333;color:#333;}#mermaid-svg-YtnA9xy5HDv29mys .node rect,#mermaid-svg-YtnA9xy5HDv29mys .node circle,#mermaid-svg-YtnA9xy5HDv29mys .node ellipse,#mermaid-svg-YtnA9xy5HDv29mys .node polygon,#mermaid-svg-YtnA9xy5HDv29mys .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-YtnA9xy5HDv29mys .rough-node .label text,#mermaid-svg-YtnA9xy5HDv29mys .node .label text,#mermaid-svg-YtnA9xy5HDv29mys .image-shape .label,#mermaid-svg-YtnA9xy5HDv29mys .icon-shape .label{text-anchor:middle;}#mermaid-svg-YtnA9xy5HDv29mys .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-YtnA9xy5HDv29mys .rough-node .label,#mermaid-svg-YtnA9xy5HDv29mys .node .label,#mermaid-svg-YtnA9xy5HDv29mys .image-shape .label,#mermaid-svg-YtnA9xy5HDv29mys .icon-shape .label{text-align:center;}#mermaid-svg-YtnA9xy5HDv29mys .node.clickable{cursor:pointer;}#mermaid-svg-YtnA9xy5HDv29mys .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-YtnA9xy5HDv29mys .arrowheadPath{fill:#333333;}#mermaid-svg-YtnA9xy5HDv29mys .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-YtnA9xy5HDv29mys .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-YtnA9xy5HDv29mys .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YtnA9xy5HDv29mys .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-YtnA9xy5HDv29mys .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YtnA9xy5HDv29mys .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-YtnA9xy5HDv29mys .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-YtnA9xy5HDv29mys .cluster text{fill:#333;}#mermaid-svg-YtnA9xy5HDv29mys .cluster span{color:#333;}#mermaid-svg-YtnA9xy5HDv29mys div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-YtnA9xy5HDv29mys .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-YtnA9xy5HDv29mys rect.text{fill:none;stroke-width:0;}#mermaid-svg-YtnA9xy5HDv29mys .icon-shape,#mermaid-svg-YtnA9xy5HDv29mys .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YtnA9xy5HDv29mys .icon-shape p,#mermaid-svg-YtnA9xy5HDv29mys .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-YtnA9xy5HDv29mys .icon-shape .label rect,#mermaid-svg-YtnA9xy5HDv29mys .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YtnA9xy5HDv29mys .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-YtnA9xy5HDv29mys .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-YtnA9xy5HDv29mys :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Java源码 .java
词法分析
语法分析
语义分析
中间代码生成
代码优化
字节码生成 .class
具体来说,javac在编译时会经历以下阶段:
-
词法分析 :将源代码的字符序列转换为Token(词法单元)序列。例如,
int x = 10;会被拆解为int(关键字)、x(标识符)、=(操作符)、10(字面量)、;(分隔符)。 -
语法分析:将Token序列按照Java语法规则组织成抽象语法树(AST)。这一阶段会检测语法错误,比如缺少分号、括号不匹配等。
-
语义分析:检查程序的语义正确性。包括类型检查(赋值类型是否匹配)、变量声明检查(使用前是否已声明)、访问权限检查等。
-
字节码生成:将经过语法和语义检查的AST转换为平台无关的字节码指令序列,写入.class文件。每个.class文件包含一个类的完整定义信息。
java启动器负责启动JVM并加载指定的类执行。当一个Java程序启动时,java命令会:
- 创建一个JVM实例
- 通过类加载器加载指定的主类(包含main方法的类)
- 调用主类的main方法作为程序入口
- 程序执行完成后,销毁JVM实例
2.5 JDK中的监控与诊断工具
随着Java版本的发展,JDK中集成了越来越多强大的监控和诊断工具:
- jps(JVM Process Status):类似于Unix的ps命令,列出当前系统中运行的所有Java进程以及它们的进程ID。
- jstat(JVM Statistics Monitoring):可以实时监控JVM中垃圾回收的执行情况、类加载数量、JIT编译时间等,是性能调优时的利器。
- jmap(Memory Map):可以打印JVM堆内存的配置和使用情况,也可以导出堆内存快照(heap dump)用于离线分析内存泄漏。
- jstack(Stack Trace):用于打印某个Java进程中所有线程的当前堆栈信息,常用于死锁检测和CPU高负载问题排查。
- jconsole / VisualVM:图形化的JVM监控工具,可以直观地查看内存使用曲线、线程状态、类加载信息等。
三、JRE:Java运行环境
3.1 什么是JRE?
**JRE(Java Runtime Environment,Java运行环境)**是运行Java程序所需的最小软件集合。如果JDK是开发者的工具箱,那么JRE就是用户的"播放器"------用户不需要知道程序是如何编写的,只需要一个能够运行它并看到效果的环境。
JRE包含了两个核心部分:JVM(Java虚拟机)和Java核心类库(Core Libraries/Java API)。
#mermaid-svg-JrgLcpayiVHUpCnv{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-JrgLcpayiVHUpCnv .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-JrgLcpayiVHUpCnv .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-JrgLcpayiVHUpCnv .error-icon{fill:#552222;}#mermaid-svg-JrgLcpayiVHUpCnv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-JrgLcpayiVHUpCnv .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-JrgLcpayiVHUpCnv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-JrgLcpayiVHUpCnv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-JrgLcpayiVHUpCnv .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-JrgLcpayiVHUpCnv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-JrgLcpayiVHUpCnv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-JrgLcpayiVHUpCnv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-JrgLcpayiVHUpCnv .marker.cross{stroke:#333333;}#mermaid-svg-JrgLcpayiVHUpCnv svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-JrgLcpayiVHUpCnv p{margin:0;}#mermaid-svg-JrgLcpayiVHUpCnv .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-JrgLcpayiVHUpCnv .cluster-label text{fill:#333;}#mermaid-svg-JrgLcpayiVHUpCnv .cluster-label span{color:#333;}#mermaid-svg-JrgLcpayiVHUpCnv .cluster-label span p{background-color:transparent;}#mermaid-svg-JrgLcpayiVHUpCnv .label text,#mermaid-svg-JrgLcpayiVHUpCnv span{fill:#333;color:#333;}#mermaid-svg-JrgLcpayiVHUpCnv .node rect,#mermaid-svg-JrgLcpayiVHUpCnv .node circle,#mermaid-svg-JrgLcpayiVHUpCnv .node ellipse,#mermaid-svg-JrgLcpayiVHUpCnv .node polygon,#mermaid-svg-JrgLcpayiVHUpCnv .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-JrgLcpayiVHUpCnv .rough-node .label text,#mermaid-svg-JrgLcpayiVHUpCnv .node .label text,#mermaid-svg-JrgLcpayiVHUpCnv .image-shape .label,#mermaid-svg-JrgLcpayiVHUpCnv .icon-shape .label{text-anchor:middle;}#mermaid-svg-JrgLcpayiVHUpCnv .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-JrgLcpayiVHUpCnv .rough-node .label,#mermaid-svg-JrgLcpayiVHUpCnv .node .label,#mermaid-svg-JrgLcpayiVHUpCnv .image-shape .label,#mermaid-svg-JrgLcpayiVHUpCnv .icon-shape .label{text-align:center;}#mermaid-svg-JrgLcpayiVHUpCnv .node.clickable{cursor:pointer;}#mermaid-svg-JrgLcpayiVHUpCnv .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-JrgLcpayiVHUpCnv .arrowheadPath{fill:#333333;}#mermaid-svg-JrgLcpayiVHUpCnv .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-JrgLcpayiVHUpCnv .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-JrgLcpayiVHUpCnv .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-JrgLcpayiVHUpCnv .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-JrgLcpayiVHUpCnv .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-JrgLcpayiVHUpCnv .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-JrgLcpayiVHUpCnv .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-JrgLcpayiVHUpCnv .cluster text{fill:#333;}#mermaid-svg-JrgLcpayiVHUpCnv .cluster span{color:#333;}#mermaid-svg-JrgLcpayiVHUpCnv div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-JrgLcpayiVHUpCnv .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-JrgLcpayiVHUpCnv rect.text{fill:none;stroke-width:0;}#mermaid-svg-JrgLcpayiVHUpCnv .icon-shape,#mermaid-svg-JrgLcpayiVHUpCnv .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-JrgLcpayiVHUpCnv .icon-shape p,#mermaid-svg-JrgLcpayiVHUpCnv .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-JrgLcpayiVHUpCnv .icon-shape .label rect,#mermaid-svg-JrgLcpayiVHUpCnv .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-JrgLcpayiVHUpCnv .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-JrgLcpayiVHUpCnv .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-JrgLcpayiVHUpCnv :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} JRE - Java Runtime Environment
JVM - Java Virtual Machine
核心类库 Core Libraries
配置与资源文件
类加载器 ClassLoader
运行时数据区
执行引擎 Execution Engine
java.lang - 语言基础类
java.util - 集合与工具类
java.io - 输入输出类
java.net - 网络通信类
java.math - 数学运算类
java.sql - 数据库访问类
更多标准包...
3.2 JRE的核心职能
JRE的职能可以概括为三个层面:
第一层:提供JVM实例 。JVM是执行字节码的核心引擎。当你运行java命令时,JRE会在操作系统上创建一个JVM实例。
第二层:提供核心类库 。你的Java程序不可避免地会使用到Java标准库中的类。例如,System.out.println()用到了java.lang.System类;ArrayList用到了java.util.ArrayList类;文件操作用到了java.io.File类。这些类都是由JRE提供的。
第三层:提供运行时支持。包括类加载机制、安全管理、资源查找(如国际化资源文件)、字体渲染、图形库(AWT/Swing的底层实现)等。
3.3 核心类库概览
Java核心类库(Java Core API)是Java平台的重要组成部分。它提供了数千个预定义的类,涵盖了程序开发的方方面面。以下是几个最重要的包:
| 包名 | 主要功能 | 核心类举例 |
|---|---|---|
java.lang |
语言基础类(自动导入) | String, Object, System, Thread, Math, Exception |
java.util |
工具类和集合框架 | ArrayList, HashMap, Date, Calendar, Optional, Stream |
java.io |
输入输出操作 | File, InputStream, OutputStream, BufferedReader |
java.nio |
非阻塞IO(New IO) | ByteBuffer, Channel, Path, Files |
java.net |
网络编程 | URL, HttpURLConnection, Socket, ServerSocket |
java.sql |
数据库操作 | Connection, Statement, ResultSet, DriverManager |
java.math |
高精度数学运算 | BigInteger, BigDecimal |
java.time |
日期时间API(JDK 8+) | LocalDate, LocalTime, LocalDateTime, Duration |
java.security |
安全框架 | MessageDigest, KeyStore, SecurityManager |
java.text |
文本处理与格式化 | SimpleDateFormat, NumberFormat, MessageFormat |
3.4 普通用户视角的JRE
假设你是一名普通电脑用户,一个朋友发给你一个Java程序(一个.jar文件)。你不需要安装JDK,只需要在你的电脑上安装JRE。安装完成后,双击.jar文件或执行java -jar program.jar命令,程序就可以运行了。
从这个角度看,JRE对普通用户而言就是"Java程序的运行平台",就像你需要在电脑上安装PDF阅读器才能打开PDF文件一样------JRE就是Java程序的"打开工具"。
四、JVM:Java虚拟机
4.1 什么是JVM?
**JVM(Java Virtual Machine,Java虚拟机)**是整个Java平台最底层、也是最核心的组件。它是一个虚拟的计算机,运行在真实的操作系统之上,专门用来执行Java字节码程序。
JVM不是一个物理设备,而是一个软件程序。当一个Java程序启动时,操作系统会为它启动一个JVM进程,在这个进程中执行字节码。如果同时运行三个Java程序,操作系统中就会有三个独立的JVM进程在运行。
#mermaid-svg-r4NHj8cFCxYFmyhl{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-r4NHj8cFCxYFmyhl .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-r4NHj8cFCxYFmyhl .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-r4NHj8cFCxYFmyhl .error-icon{fill:#552222;}#mermaid-svg-r4NHj8cFCxYFmyhl .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-r4NHj8cFCxYFmyhl .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-r4NHj8cFCxYFmyhl .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-r4NHj8cFCxYFmyhl .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-r4NHj8cFCxYFmyhl .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-r4NHj8cFCxYFmyhl .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-r4NHj8cFCxYFmyhl .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-r4NHj8cFCxYFmyhl .marker{fill:#333333;stroke:#333333;}#mermaid-svg-r4NHj8cFCxYFmyhl .marker.cross{stroke:#333333;}#mermaid-svg-r4NHj8cFCxYFmyhl svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-r4NHj8cFCxYFmyhl p{margin:0;}#mermaid-svg-r4NHj8cFCxYFmyhl .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-r4NHj8cFCxYFmyhl .cluster-label text{fill:#333;}#mermaid-svg-r4NHj8cFCxYFmyhl .cluster-label span{color:#333;}#mermaid-svg-r4NHj8cFCxYFmyhl .cluster-label span p{background-color:transparent;}#mermaid-svg-r4NHj8cFCxYFmyhl .label text,#mermaid-svg-r4NHj8cFCxYFmyhl span{fill:#333;color:#333;}#mermaid-svg-r4NHj8cFCxYFmyhl .node rect,#mermaid-svg-r4NHj8cFCxYFmyhl .node circle,#mermaid-svg-r4NHj8cFCxYFmyhl .node ellipse,#mermaid-svg-r4NHj8cFCxYFmyhl .node polygon,#mermaid-svg-r4NHj8cFCxYFmyhl .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-r4NHj8cFCxYFmyhl .rough-node .label text,#mermaid-svg-r4NHj8cFCxYFmyhl .node .label text,#mermaid-svg-r4NHj8cFCxYFmyhl .image-shape .label,#mermaid-svg-r4NHj8cFCxYFmyhl .icon-shape .label{text-anchor:middle;}#mermaid-svg-r4NHj8cFCxYFmyhl .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-r4NHj8cFCxYFmyhl .rough-node .label,#mermaid-svg-r4NHj8cFCxYFmyhl .node .label,#mermaid-svg-r4NHj8cFCxYFmyhl .image-shape .label,#mermaid-svg-r4NHj8cFCxYFmyhl .icon-shape .label{text-align:center;}#mermaid-svg-r4NHj8cFCxYFmyhl .node.clickable{cursor:pointer;}#mermaid-svg-r4NHj8cFCxYFmyhl .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-r4NHj8cFCxYFmyhl .arrowheadPath{fill:#333333;}#mermaid-svg-r4NHj8cFCxYFmyhl .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-r4NHj8cFCxYFmyhl .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-r4NHj8cFCxYFmyhl .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-r4NHj8cFCxYFmyhl .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-r4NHj8cFCxYFmyhl .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-r4NHj8cFCxYFmyhl .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-r4NHj8cFCxYFmyhl .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-r4NHj8cFCxYFmyhl .cluster text{fill:#333;}#mermaid-svg-r4NHj8cFCxYFmyhl .cluster span{color:#333;}#mermaid-svg-r4NHj8cFCxYFmyhl div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-r4NHj8cFCxYFmyhl .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-r4NHj8cFCxYFmyhl rect.text{fill:none;stroke-width:0;}#mermaid-svg-r4NHj8cFCxYFmyhl .icon-shape,#mermaid-svg-r4NHj8cFCxYFmyhl .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-r4NHj8cFCxYFmyhl .icon-shape p,#mermaid-svg-r4NHj8cFCxYFmyhl .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-r4NHj8cFCxYFmyhl .icon-shape .label rect,#mermaid-svg-r4NHj8cFCxYFmyhl .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-r4NHj8cFCxYFmyhl .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-r4NHj8cFCxYFmyhl .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-r4NHj8cFCxYFmyhl :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Java应用
JVM进程
操作系统层
物理层
CPU 处理器
物理内存
硬盘
网络
操作系统 Windows/Linux/macOS
JVM实例进程
堆内存 Heap
栈内存 Stacks
方法区/元空间
线程 Threads
垃圾回收器 GC
Java程序 字节码执行
4.2 JVM的核心价值
JVM的最核心价值可以用一句话概括:实现"一次编写,到处运行"(Write Once, Run Anywhere)。
Java源代码编译后生成的字节码文件(.class)是JVM的"机器语言",而不是x86、ARM等物理CPU的机器语言。不同的操作系统运行着不同的JVM实现,但所有这些JVM实现都遵循完全相同的字节码指令规范。因此,同一份字节码文件可以在任何安装了JVM的平台上运行。
| 特性 | C/C++程序 | Java程序 |
|---|---|---|
| 编译产物 | 平台相关的本地机器码 | 平台无关的字节码 |
| 运行方式 | 操作系统直接执行 | JVM解释/编译执行 |
| 跨平台 | 需要为每个平台重新编译 | 一份编译,到处运行 |
| 执行速度 | 原生执行,通常更快 | 经过JIT优化后接近原生 |
| 内存管理 | 手动管理(malloc/free) | JVM自动垃圾回收 |
4.3 JVM的规范与实现
JVM是一个规范(Specification),而不仅仅是某个具体的软件产品。Oracle发布了《Java虚拟机规范》(The Java Virtual Machine Specification),详细定义了:
- 字节码指令集(共200多条指令)
- class文件格式
- 类加载过程
- 运行时数据区结构
- 异常处理机制
- 线程模型
任何遵循该规范的实现都可以被称为JVM。事实上,世界上存在多种JVM实现:
| JVM实现 | 开发方 | 特点 |
|---|---|---|
| HotSpot VM | Oracle/Sun | 最主流、最成熟的JVM实现,JDK默认 |
| OpenJ9 | Eclipse/IBM | 启动快、内存占用小,适合微服务和容器 |
| GraalVM | Oracle Labs | 多语言虚拟机,支持AOT编译 |
| Zing VM | Azul | 低延迟GC(C4算法),适合金融交易系统 |
| Android Runtime (ART) | 用于Android系统的Java字节码运行时 |
4.4 JVM是如何做到跨平台的?
JVM在不同操作系统上的实现充当了"翻译官"的角色。它将标准的字节码指令"翻译"成不同操作系统能够理解的本地指令。比如:
- 在Windows上,HotSpot VM使用Windows的系统调用(Win32 API)来申请内存、创建线程、读写文件
- 在Linux上,同样的HotSpot VM使用Linux的系统调用(POSIX API)
- 在macOS上,则使用Darwin内核的系统调用
对于Java开发者来说,这些底层差异是完全透明的。你写的new FileInputStream("data.txt")代码在Windows、Linux、macOS上都能正常执行------因为JVM的实现已经在各自的平台上处理好了文件系统的差异。
五、JDK、JRE、JVM三者的关系
5.1 包含关系:洋葱模型
JDK、JRE、JVM三者的关系可以用"洋葱模型"来描述------层层包含,由外向内:
┌─────────────────────────────────┐
│ JDK │
│ ┌───────────────────────────┐ │
│ │ JRE │ │
│ │ ┌─────────────────────┐ │ │
│ │ │ JVM │ │ │
│ │ │ ┌───────────────┐ │ │ │
│ │ │ │ 其他组件 │ │ │ │
│ │ │ └───────────────┘ │ │ │
│ │ └─────────────────────┘ │ │
│ └───────────────────────────┘ │
│ 开发工具 (javac等) │
└─────────────────────────────────┘
更精确地说:
- JDK = JRE + 开发工具集(javac、jar、javadoc、调试器、监控工具等)
- JRE = JVM + Java核心类库 + 运行时支持文件
- JVM 是Java程序真正执行的地方
#mermaid-svg-ygALGDC63A7kP5s2{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ygALGDC63A7kP5s2 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ygALGDC63A7kP5s2 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ygALGDC63A7kP5s2 .error-icon{fill:#552222;}#mermaid-svg-ygALGDC63A7kP5s2 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ygALGDC63A7kP5s2 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ygALGDC63A7kP5s2 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ygALGDC63A7kP5s2 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ygALGDC63A7kP5s2 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ygALGDC63A7kP5s2 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ygALGDC63A7kP5s2 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ygALGDC63A7kP5s2 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ygALGDC63A7kP5s2 .marker.cross{stroke:#333333;}#mermaid-svg-ygALGDC63A7kP5s2 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ygALGDC63A7kP5s2 p{margin:0;}#mermaid-svg-ygALGDC63A7kP5s2 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ygALGDC63A7kP5s2 .cluster-label text{fill:#333;}#mermaid-svg-ygALGDC63A7kP5s2 .cluster-label span{color:#333;}#mermaid-svg-ygALGDC63A7kP5s2 .cluster-label span p{background-color:transparent;}#mermaid-svg-ygALGDC63A7kP5s2 .label text,#mermaid-svg-ygALGDC63A7kP5s2 span{fill:#333;color:#333;}#mermaid-svg-ygALGDC63A7kP5s2 .node rect,#mermaid-svg-ygALGDC63A7kP5s2 .node circle,#mermaid-svg-ygALGDC63A7kP5s2 .node ellipse,#mermaid-svg-ygALGDC63A7kP5s2 .node polygon,#mermaid-svg-ygALGDC63A7kP5s2 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ygALGDC63A7kP5s2 .rough-node .label text,#mermaid-svg-ygALGDC63A7kP5s2 .node .label text,#mermaid-svg-ygALGDC63A7kP5s2 .image-shape .label,#mermaid-svg-ygALGDC63A7kP5s2 .icon-shape .label{text-anchor:middle;}#mermaid-svg-ygALGDC63A7kP5s2 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ygALGDC63A7kP5s2 .rough-node .label,#mermaid-svg-ygALGDC63A7kP5s2 .node .label,#mermaid-svg-ygALGDC63A7kP5s2 .image-shape .label,#mermaid-svg-ygALGDC63A7kP5s2 .icon-shape .label{text-align:center;}#mermaid-svg-ygALGDC63A7kP5s2 .node.clickable{cursor:pointer;}#mermaid-svg-ygALGDC63A7kP5s2 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ygALGDC63A7kP5s2 .arrowheadPath{fill:#333333;}#mermaid-svg-ygALGDC63A7kP5s2 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ygALGDC63A7kP5s2 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ygALGDC63A7kP5s2 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ygALGDC63A7kP5s2 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ygALGDC63A7kP5s2 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ygALGDC63A7kP5s2 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ygALGDC63A7kP5s2 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ygALGDC63A7kP5s2 .cluster text{fill:#333;}#mermaid-svg-ygALGDC63A7kP5s2 .cluster span{color:#333;}#mermaid-svg-ygALGDC63A7kP5s2 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ygALGDC63A7kP5s2 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ygALGDC63A7kP5s2 rect.text{fill:none;stroke-width:0;}#mermaid-svg-ygALGDC63A7kP5s2 .icon-shape,#mermaid-svg-ygALGDC63A7kP5s2 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ygALGDC63A7kP5s2 .icon-shape p,#mermaid-svg-ygALGDC63A7kP5s2 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ygALGDC63A7kP5s2 .icon-shape .label rect,#mermaid-svg-ygALGDC63A7kP5s2 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ygALGDC63A7kP5s2 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ygALGDC63A7kP5s2 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ygALGDC63A7kP5s2 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 包含
包含
同时包含
同时包含
JDK 最外层
包含所有开发工具
JRE 中间层
包含运行所需的所有资源
JVM 最内层
执行字节码的核心引擎
开发工具
javac/java/jar/javadoc/jshell等
核心类库
java.lang/java.util/java.io等
5.2 用代码验证三者的关系
我们可以通过执行一些Java命令来直观地感受三者的关系:
java
// 示例:用jshell查看JDK/JRE的安装路径信息
// 在命令行执行 jshell 进入交互模式后输入:
System.getProperty("java.home"); // 查看JRE安装路径
System.getProperty("java.version"); // 查看Java版本
System.getProperty("java.vm.name"); // 查看JVM名称
System.getProperty("java.class.path"); // 查看核心类库路径
// 在Java程序中,可以这样获取相关信息:
public class JavaEnvInfo {
public static void main(String[] args) {
System.out.println("Java版本: " + System.getProperty("java.version"));
System.out.println("JVM名称: " + System.getProperty("java.vm.name"));
System.out.println("JVM版本: " + System.getProperty("java.vm.version"));
System.out.println("JVM供应商: " + System.getProperty("java.vm.vendor"));
System.out.println("Java安装目录: " + System.getProperty("java.home"));
System.out.println("操作系统: " + System.getProperty("os.name"));
System.out.println("操作系统架构: " + System.getProperty("os.arch"));
}
}
运行这段代码的输出示例(Windows环境):
Java版本: 17.0.8
JVM名称: Java HotSpot(TM) 64-Bit Server VM
JVM版本: 17.0.8+9-LTS-211
JVM供应商: Oracle Corporation
Java安装目录: C:\Program Files\Java\jdk-17
操作系统: Windows 11
操作系统架构: amd64
5.3 角色分工类比
用一个通俗的类比来帮助理解三者的分工:
| 角色 | 对应概念 | 类比说明 |
|---|---|---|
| 厨师 | JDK | 拥有全套厨具和食材,既能烹饪菜肴,也能品尝菜肴 |
| 餐桌/餐具 | JRE | 提供了享用菜肴所需的环境:桌子、盘子、筷子 |
| 消化系统 | JVM | 真正"处理"食物的地方,将食物转化为身体能用的能量 |
- 用户只需要吃饭(JRE),不需要知道怎么做饭(不需要JDK)
- 厨师(开发者)既需要原材料和工具(JDK),也需要餐桌来试吃(JRE)
- 无论什么菜(什么操作系统的Java程序),消化系统(JVM)都能处理
六、Java程序从编写到执行的完整过程
6.1 全景流程图
理解JDK、JRE、JVM三者关系的最好方式,是追踪一段Java程序从编写到执行的全过程:
#mermaid-svg-IswugDCXoYozEH4p{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-IswugDCXoYozEH4p .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-IswugDCXoYozEH4p .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-IswugDCXoYozEH4p .error-icon{fill:#552222;}#mermaid-svg-IswugDCXoYozEH4p .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-IswugDCXoYozEH4p .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-IswugDCXoYozEH4p .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-IswugDCXoYozEH4p .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-IswugDCXoYozEH4p .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-IswugDCXoYozEH4p .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-IswugDCXoYozEH4p .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-IswugDCXoYozEH4p .marker{fill:#333333;stroke:#333333;}#mermaid-svg-IswugDCXoYozEH4p .marker.cross{stroke:#333333;}#mermaid-svg-IswugDCXoYozEH4p svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-IswugDCXoYozEH4p p{margin:0;}#mermaid-svg-IswugDCXoYozEH4p .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-IswugDCXoYozEH4p .cluster-label text{fill:#333;}#mermaid-svg-IswugDCXoYozEH4p .cluster-label span{color:#333;}#mermaid-svg-IswugDCXoYozEH4p .cluster-label span p{background-color:transparent;}#mermaid-svg-IswugDCXoYozEH4p .label text,#mermaid-svg-IswugDCXoYozEH4p span{fill:#333;color:#333;}#mermaid-svg-IswugDCXoYozEH4p .node rect,#mermaid-svg-IswugDCXoYozEH4p .node circle,#mermaid-svg-IswugDCXoYozEH4p .node ellipse,#mermaid-svg-IswugDCXoYozEH4p .node polygon,#mermaid-svg-IswugDCXoYozEH4p .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-IswugDCXoYozEH4p .rough-node .label text,#mermaid-svg-IswugDCXoYozEH4p .node .label text,#mermaid-svg-IswugDCXoYozEH4p .image-shape .label,#mermaid-svg-IswugDCXoYozEH4p .icon-shape .label{text-anchor:middle;}#mermaid-svg-IswugDCXoYozEH4p .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-IswugDCXoYozEH4p .rough-node .label,#mermaid-svg-IswugDCXoYozEH4p .node .label,#mermaid-svg-IswugDCXoYozEH4p .image-shape .label,#mermaid-svg-IswugDCXoYozEH4p .icon-shape .label{text-align:center;}#mermaid-svg-IswugDCXoYozEH4p .node.clickable{cursor:pointer;}#mermaid-svg-IswugDCXoYozEH4p .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-IswugDCXoYozEH4p .arrowheadPath{fill:#333333;}#mermaid-svg-IswugDCXoYozEH4p .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-IswugDCXoYozEH4p .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-IswugDCXoYozEH4p .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IswugDCXoYozEH4p .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-IswugDCXoYozEH4p .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IswugDCXoYozEH4p .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-IswugDCXoYozEH4p .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-IswugDCXoYozEH4p .cluster text{fill:#333;}#mermaid-svg-IswugDCXoYozEH4p .cluster span{color:#333;}#mermaid-svg-IswugDCXoYozEH4p div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-IswugDCXoYozEH4p .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-IswugDCXoYozEH4p rect.text{fill:none;stroke-width:0;}#mermaid-svg-IswugDCXoYozEH4p .icon-shape,#mermaid-svg-IswugDCXoYozEH4p .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IswugDCXoYozEH4p .icon-shape p,#mermaid-svg-IswugDCXoYozEH4p .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-IswugDCXoYozEH4p .icon-shape .label rect,#mermaid-svg-IswugDCXoYozEH4p .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IswugDCXoYozEH4p .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-IswugDCXoYozEH4p .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-IswugDCXoYozEH4p :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} javac编译
java启动
编写的Java源代码
Hello.java
字节码文件
Hello.class
JVM实例启动
类加载器
ClassLoader加载Hello.class
字节码验证
确保安全性
准备阶段
分配静态变量内存
解析阶段
符号引用转直接引用
初始化阶段
执行static代码
执行引擎
逐条执行字节码指令
解释执行
逐条翻译字节码
JIT编译
热点代码编译为本地机器码
程序运行中...
垃圾回收器
回收不再使用的对象
程序结束
JVM实例销毁
6.2 具体步骤详解
第一步:编写源代码
java
// 文件名:Hello.java
public class Hello {
public static void main(String[] args) {
String message = "Hello, World!";
System.out.println(message);
}
}
第二步:调用javac编译器
打开命令行,进入文件所在目录,执行:
bash
javac Hello.java
JDK中的javac编译器会将Hello.java中的源代码进行词法分析、语法分析、语义分析,最终生成一个名为Hello.class的字节码文件。这个文件的内容不是人类可读的文本,而是一系列字节码指令。
我们可以用javap反编译看一下:
bash
javap -c Hello.class
输出结果类似:
Compiled from "Hello.java"
public class Hello {
public Hello();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: ldc #7 // String Hello, World!
2: astore_1
3: getstatic #9 // Field java/lang/System.out
6: aload_1
7: invokevirtual #15 // Method java/io/PrintStream.println
10: return
}
这里我们可以看到main方法对应的字节码指令:ldc加载字符串常量,astore_1存储到局部变量,getstatic获取System.out静态字段,aload_1加载变量,invokevirtual调用println方法。这就是JVM将要执行的"机器码"。
第三步:java命令启动JVM
bash
java Hello
此时操作系统创建一个JVM进程(在任务管理器中可以看到java.exe进程)。JVM通过类加载器(ClassLoader)将Hello.class文件加载到内存中。
第四步:类加载与初始化
类加载器按照"双亲委派模型"工作:
- 先从启动类加载器(Bootstrap ClassLoader)开始,它负责加载JDK核心类库(rt.jar中的所有类)
- 再到扩展类加载器(Extension/Platform ClassLoader),它负责加载扩展目录中的类
- 最后到应用类加载器(Application ClassLoader),它负责加载用户编写的类(Hello.class)
加载完成后,JVM会对字节码进行验证(确保格式正确、没有安全隐患),然后进行准备(为静态变量分配内存并赋默认值)、解析(将类中的符号引用转换为直接引用),最后进行初始化(执行静态代码块和静态变量的赋值)。
第五步:执行引擎工作
JVM的执行引擎开始逐条解释执行main方法中的字节码指令。执行过程中涉及JVM的多个内存区域:
- 栈(Stack) :每个线程有自己的栈,栈中存储着栈帧(Stack Frame)。main方法对应一个栈帧,其中存储着局部变量表(如
String message变量)、操作数栈(计算过程中的临时数据)、动态链接、返回地址等信息。 - 堆(Heap) :所有对象实例都在堆上分配内存。
"Hello, World!"这个String对象就存储在堆中。 - 方法区(Method Area / Metaspace):存储类的结构信息,包括类的字段、方法、常量池等。
第六步:JIT编译优化
如果某段代码被频繁执行(热点代码),JVM的JIT(Just-In-Time)编译器会将其直接编译成本地机器码(而不是每次都解释执行),从而大幅提升执行效率。HotSpot VM的名字就来源于此------它能够识别"热点(Hot Spot)"并进行优化。
第七步:垃圾回收
在程序运行过程中,JVM的垃圾回收器(Garbage Collector, GC)会自动检测并回收不再被引用的对象所占用的内存,开发者无需手动释放内存。
第八步:程序结束
main方法执行完毕,所有非守护线程结束,JVM进程退出。操作系统回收该进程占用的所有资源。
七、JVM体系结构详解
7.1 JVM整体架构
JVM的体系结构可以分为三个主要部分:类加载子系统 、运行时数据区 、执行引擎。每一部分又包含多个子组件。
#mermaid-svg-GC29suVenX4WkRvE{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-GC29suVenX4WkRvE .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-GC29suVenX4WkRvE .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-GC29suVenX4WkRvE .error-icon{fill:#552222;}#mermaid-svg-GC29suVenX4WkRvE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-GC29suVenX4WkRvE .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-GC29suVenX4WkRvE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-GC29suVenX4WkRvE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-GC29suVenX4WkRvE .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-GC29suVenX4WkRvE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-GC29suVenX4WkRvE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-GC29suVenX4WkRvE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-GC29suVenX4WkRvE .marker.cross{stroke:#333333;}#mermaid-svg-GC29suVenX4WkRvE svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-GC29suVenX4WkRvE p{margin:0;}#mermaid-svg-GC29suVenX4WkRvE .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-GC29suVenX4WkRvE .cluster-label text{fill:#333;}#mermaid-svg-GC29suVenX4WkRvE .cluster-label span{color:#333;}#mermaid-svg-GC29suVenX4WkRvE .cluster-label span p{background-color:transparent;}#mermaid-svg-GC29suVenX4WkRvE .label text,#mermaid-svg-GC29suVenX4WkRvE span{fill:#333;color:#333;}#mermaid-svg-GC29suVenX4WkRvE .node rect,#mermaid-svg-GC29suVenX4WkRvE .node circle,#mermaid-svg-GC29suVenX4WkRvE .node ellipse,#mermaid-svg-GC29suVenX4WkRvE .node polygon,#mermaid-svg-GC29suVenX4WkRvE .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-GC29suVenX4WkRvE .rough-node .label text,#mermaid-svg-GC29suVenX4WkRvE .node .label text,#mermaid-svg-GC29suVenX4WkRvE .image-shape .label,#mermaid-svg-GC29suVenX4WkRvE .icon-shape .label{text-anchor:middle;}#mermaid-svg-GC29suVenX4WkRvE .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-GC29suVenX4WkRvE .rough-node .label,#mermaid-svg-GC29suVenX4WkRvE .node .label,#mermaid-svg-GC29suVenX4WkRvE .image-shape .label,#mermaid-svg-GC29suVenX4WkRvE .icon-shape .label{text-align:center;}#mermaid-svg-GC29suVenX4WkRvE .node.clickable{cursor:pointer;}#mermaid-svg-GC29suVenX4WkRvE .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-GC29suVenX4WkRvE .arrowheadPath{fill:#333333;}#mermaid-svg-GC29suVenX4WkRvE .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-GC29suVenX4WkRvE .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-GC29suVenX4WkRvE .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GC29suVenX4WkRvE .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-GC29suVenX4WkRvE .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GC29suVenX4WkRvE .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-GC29suVenX4WkRvE .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-GC29suVenX4WkRvE .cluster text{fill:#333;}#mermaid-svg-GC29suVenX4WkRvE .cluster span{color:#333;}#mermaid-svg-GC29suVenX4WkRvE div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-GC29suVenX4WkRvE .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-GC29suVenX4WkRvE rect.text{fill:none;stroke-width:0;}#mermaid-svg-GC29suVenX4WkRvE .icon-shape,#mermaid-svg-GC29suVenX4WkRvE .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GC29suVenX4WkRvE .icon-shape p,#mermaid-svg-GC29suVenX4WkRvE .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-GC29suVenX4WkRvE .icon-shape .label rect,#mermaid-svg-GC29suVenX4WkRvE .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GC29suVenX4WkRvE .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-GC29suVenX4WkRvE .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-GC29suVenX4WkRvE :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} JVM整体架构
执行引擎 Execution Engine
加载类到
操作
使用
解释器 Interpreter
类加载子系统 ClassLoader Subsystem
Bootstrap ClassLoader
启动类加载器
Platform ClassLoader
平台类加载器
Application ClassLoader
应用类加载器
运行时数据区 Runtime Data Areas
方法区/元空间
Method Area/Metaspace
堆 Heap
虚拟机栈 JVM Stacks
程序计数器 PC Registers
本地方法栈
Native Method Stack
JNI 本地方法接口
JIT编译器
C1 Client / C2 Server
垃圾回收器
Garbage Collector
7.2 类加载子系统
类加载子系统负责从文件系统或网络中加载类的字节码数据,并对加载的类进行验证、准备、解析和初始化。
类加载的生命周期分为七个阶段:
| 阶段 | 英文 | 说明 |
|---|---|---|
| 加载 | Loading | 通过类的全限定名获取二进制字节流,构造Class对象 |
| 验证 | Verification | 确保字节码符合JVM规范,防止恶意代码 |
| 准备 | Preparation | 为静态变量分配内存并赋默认值(int=0, Object=null) |
| 解析 | Resolution | 将常量池中的符号引用替换为直接引用 |
| 初始化 | Initialization | 执行类构造器clinit方法,初始化静态变量和静态代码块 |
| 使用 | Using | 类被程序正常使用 |
| 卸载 | Unloading | 类不再被使用,从JVM中卸载 |
双亲委派模型(Parent Delegation Model):
当一个类加载器收到类加载请求时,它首先不会尝试自己加载这个类,而是将这个请求委派给父类加载器去完成。只有当父类加载器无法完成这个加载请求时,子加载器才会尝试自己加载。
#mermaid-svg-nSZcQwet2Cvtl0S6{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-nSZcQwet2Cvtl0S6 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-nSZcQwet2Cvtl0S6 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-nSZcQwet2Cvtl0S6 .error-icon{fill:#552222;}#mermaid-svg-nSZcQwet2Cvtl0S6 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-nSZcQwet2Cvtl0S6 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-nSZcQwet2Cvtl0S6 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-nSZcQwet2Cvtl0S6 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-nSZcQwet2Cvtl0S6 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-nSZcQwet2Cvtl0S6 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-nSZcQwet2Cvtl0S6 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-nSZcQwet2Cvtl0S6 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-nSZcQwet2Cvtl0S6 .marker.cross{stroke:#333333;}#mermaid-svg-nSZcQwet2Cvtl0S6 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-nSZcQwet2Cvtl0S6 p{margin:0;}#mermaid-svg-nSZcQwet2Cvtl0S6 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-nSZcQwet2Cvtl0S6 .cluster-label text{fill:#333;}#mermaid-svg-nSZcQwet2Cvtl0S6 .cluster-label span{color:#333;}#mermaid-svg-nSZcQwet2Cvtl0S6 .cluster-label span p{background-color:transparent;}#mermaid-svg-nSZcQwet2Cvtl0S6 .label text,#mermaid-svg-nSZcQwet2Cvtl0S6 span{fill:#333;color:#333;}#mermaid-svg-nSZcQwet2Cvtl0S6 .node rect,#mermaid-svg-nSZcQwet2Cvtl0S6 .node circle,#mermaid-svg-nSZcQwet2Cvtl0S6 .node ellipse,#mermaid-svg-nSZcQwet2Cvtl0S6 .node polygon,#mermaid-svg-nSZcQwet2Cvtl0S6 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-nSZcQwet2Cvtl0S6 .rough-node .label text,#mermaid-svg-nSZcQwet2Cvtl0S6 .node .label text,#mermaid-svg-nSZcQwet2Cvtl0S6 .image-shape .label,#mermaid-svg-nSZcQwet2Cvtl0S6 .icon-shape .label{text-anchor:middle;}#mermaid-svg-nSZcQwet2Cvtl0S6 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-nSZcQwet2Cvtl0S6 .rough-node .label,#mermaid-svg-nSZcQwet2Cvtl0S6 .node .label,#mermaid-svg-nSZcQwet2Cvtl0S6 .image-shape .label,#mermaid-svg-nSZcQwet2Cvtl0S6 .icon-shape .label{text-align:center;}#mermaid-svg-nSZcQwet2Cvtl0S6 .node.clickable{cursor:pointer;}#mermaid-svg-nSZcQwet2Cvtl0S6 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-nSZcQwet2Cvtl0S6 .arrowheadPath{fill:#333333;}#mermaid-svg-nSZcQwet2Cvtl0S6 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-nSZcQwet2Cvtl0S6 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-nSZcQwet2Cvtl0S6 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-nSZcQwet2Cvtl0S6 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-nSZcQwet2Cvtl0S6 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-nSZcQwet2Cvtl0S6 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-nSZcQwet2Cvtl0S6 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-nSZcQwet2Cvtl0S6 .cluster text{fill:#333;}#mermaid-svg-nSZcQwet2Cvtl0S6 .cluster span{color:#333;}#mermaid-svg-nSZcQwet2Cvtl0S6 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-nSZcQwet2Cvtl0S6 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-nSZcQwet2Cvtl0S6 rect.text{fill:none;stroke-width:0;}#mermaid-svg-nSZcQwet2Cvtl0S6 .icon-shape,#mermaid-svg-nSZcQwet2Cvtl0S6 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-nSZcQwet2Cvtl0S6 .icon-shape p,#mermaid-svg-nSZcQwet2Cvtl0S6 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-nSZcQwet2Cvtl0S6 .icon-shape .label rect,#mermaid-svg-nSZcQwet2Cvtl0S6 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-nSZcQwet2Cvtl0S6 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-nSZcQwet2Cvtl0S6 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-nSZcQwet2Cvtl0S6 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 委派给父加载器
委派给父加载器
查找核心类库
是
否
是
否
是
否
类加载请求
应用类加载器
Application ClassLoader
平台类加载器
Platform ClassLoader
启动类加载器
Bootstrap ClassLoader
在核心类库中
找到该类?
加载并返回
委托回平台类加载器
在平台扩展库中
找到该类?
加载并返回
委托回应用类加载器
在应用类路径中
找到该类?
加载并返回
ClassNotFoundException
这种设计的最大好处是安全性 。假设有人试图编写一个名为java.lang.String的类来替换JDK核心的String类。由于双亲委派模型的存在,这个类加载请求会先到达启动类加载器,而启动类加载器在核心类库中找到了JDK原生的java.lang.String类,因此那个试图"偷梁换柱"的自定义String类永远不会被加载。这保证了Java核心类库不会被恶意代码替换。
7.3 运行时数据区
运行时数据区是JVM在运行Java程序时使用的内存区域。不同的JVM实现可能在内存布局上有所差异,但逻辑结构是统一的:
#mermaid-svg-bDPgP8I7RRBJcAbZ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-bDPgP8I7RRBJcAbZ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-bDPgP8I7RRBJcAbZ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-bDPgP8I7RRBJcAbZ .error-icon{fill:#552222;}#mermaid-svg-bDPgP8I7RRBJcAbZ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-bDPgP8I7RRBJcAbZ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-bDPgP8I7RRBJcAbZ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-bDPgP8I7RRBJcAbZ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-bDPgP8I7RRBJcAbZ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-bDPgP8I7RRBJcAbZ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-bDPgP8I7RRBJcAbZ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-bDPgP8I7RRBJcAbZ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-bDPgP8I7RRBJcAbZ .marker.cross{stroke:#333333;}#mermaid-svg-bDPgP8I7RRBJcAbZ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-bDPgP8I7RRBJcAbZ p{margin:0;}#mermaid-svg-bDPgP8I7RRBJcAbZ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-bDPgP8I7RRBJcAbZ .cluster-label text{fill:#333;}#mermaid-svg-bDPgP8I7RRBJcAbZ .cluster-label span{color:#333;}#mermaid-svg-bDPgP8I7RRBJcAbZ .cluster-label span p{background-color:transparent;}#mermaid-svg-bDPgP8I7RRBJcAbZ .label text,#mermaid-svg-bDPgP8I7RRBJcAbZ span{fill:#333;color:#333;}#mermaid-svg-bDPgP8I7RRBJcAbZ .node rect,#mermaid-svg-bDPgP8I7RRBJcAbZ .node circle,#mermaid-svg-bDPgP8I7RRBJcAbZ .node ellipse,#mermaid-svg-bDPgP8I7RRBJcAbZ .node polygon,#mermaid-svg-bDPgP8I7RRBJcAbZ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-bDPgP8I7RRBJcAbZ .rough-node .label text,#mermaid-svg-bDPgP8I7RRBJcAbZ .node .label text,#mermaid-svg-bDPgP8I7RRBJcAbZ .image-shape .label,#mermaid-svg-bDPgP8I7RRBJcAbZ .icon-shape .label{text-anchor:middle;}#mermaid-svg-bDPgP8I7RRBJcAbZ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-bDPgP8I7RRBJcAbZ .rough-node .label,#mermaid-svg-bDPgP8I7RRBJcAbZ .node .label,#mermaid-svg-bDPgP8I7RRBJcAbZ .image-shape .label,#mermaid-svg-bDPgP8I7RRBJcAbZ .icon-shape .label{text-align:center;}#mermaid-svg-bDPgP8I7RRBJcAbZ .node.clickable{cursor:pointer;}#mermaid-svg-bDPgP8I7RRBJcAbZ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-bDPgP8I7RRBJcAbZ .arrowheadPath{fill:#333333;}#mermaid-svg-bDPgP8I7RRBJcAbZ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-bDPgP8I7RRBJcAbZ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-bDPgP8I7RRBJcAbZ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-bDPgP8I7RRBJcAbZ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-bDPgP8I7RRBJcAbZ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-bDPgP8I7RRBJcAbZ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-bDPgP8I7RRBJcAbZ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-bDPgP8I7RRBJcAbZ .cluster text{fill:#333;}#mermaid-svg-bDPgP8I7RRBJcAbZ .cluster span{color:#333;}#mermaid-svg-bDPgP8I7RRBJcAbZ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-bDPgP8I7RRBJcAbZ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-bDPgP8I7RRBJcAbZ rect.text{fill:none;stroke-width:0;}#mermaid-svg-bDPgP8I7RRBJcAbZ .icon-shape,#mermaid-svg-bDPgP8I7RRBJcAbZ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-bDPgP8I7RRBJcAbZ .icon-shape p,#mermaid-svg-bDPgP8I7RRBJcAbZ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-bDPgP8I7RRBJcAbZ .icon-shape .label rect,#mermaid-svg-bDPgP8I7RRBJcAbZ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-bDPgP8I7RRBJcAbZ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-bDPgP8I7RRBJcAbZ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-bDPgP8I7RRBJcAbZ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 线程共享
堆 Heap
所有对象实例和数组
GC管理的主要区域
方法区/元空间
Method Area/Metaspace
存储类的结构信息、常量、静态变量、JIT编译后的代码
线程私有
程序计数器
PC Register
记录当前线程执行到的字节码行号
虚拟机栈
JVM Stack
每个方法调用对应一个栈帧
包含局部变量表+操作数栈
本地方法栈
Native Method Stack
为本地Native方法服务
7.3.1 程序计数器(PC Register)
程序计数器是一块很小的内存空间,它是当前线程所执行的字节码行号的指示器。每个线程都有一个独立的程序计数器,互不影响------这被称为"线程私有"内存。
如果线程正在执行的是一个Java方法,PC寄存器记录的就是正在执行的虚拟机字节码指令的地址。如果正在执行Native方法(C/C++编写的方法),这个计数器值则为空(Undefined)。
程序计数器是JVM规范中唯一没有规定任何OutOfMemoryError情况的区域。
7.3.2 虚拟机栈(JVM Stack)
每个线程在创建时都会分配一个虚拟机栈。栈中存储着一个个的栈帧(Stack Frame),每个栈帧对应一次方法调用。栈帧的结构如下:
#mermaid-svg-xtx5vi5m85ON1lKs{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-xtx5vi5m85ON1lKs .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-xtx5vi5m85ON1lKs .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-xtx5vi5m85ON1lKs .error-icon{fill:#552222;}#mermaid-svg-xtx5vi5m85ON1lKs .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-xtx5vi5m85ON1lKs .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-xtx5vi5m85ON1lKs .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-xtx5vi5m85ON1lKs .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-xtx5vi5m85ON1lKs .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-xtx5vi5m85ON1lKs .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-xtx5vi5m85ON1lKs .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-xtx5vi5m85ON1lKs .marker{fill:#333333;stroke:#333333;}#mermaid-svg-xtx5vi5m85ON1lKs .marker.cross{stroke:#333333;}#mermaid-svg-xtx5vi5m85ON1lKs svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-xtx5vi5m85ON1lKs p{margin:0;}#mermaid-svg-xtx5vi5m85ON1lKs .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-xtx5vi5m85ON1lKs .cluster-label text{fill:#333;}#mermaid-svg-xtx5vi5m85ON1lKs .cluster-label span{color:#333;}#mermaid-svg-xtx5vi5m85ON1lKs .cluster-label span p{background-color:transparent;}#mermaid-svg-xtx5vi5m85ON1lKs .label text,#mermaid-svg-xtx5vi5m85ON1lKs span{fill:#333;color:#333;}#mermaid-svg-xtx5vi5m85ON1lKs .node rect,#mermaid-svg-xtx5vi5m85ON1lKs .node circle,#mermaid-svg-xtx5vi5m85ON1lKs .node ellipse,#mermaid-svg-xtx5vi5m85ON1lKs .node polygon,#mermaid-svg-xtx5vi5m85ON1lKs .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-xtx5vi5m85ON1lKs .rough-node .label text,#mermaid-svg-xtx5vi5m85ON1lKs .node .label text,#mermaid-svg-xtx5vi5m85ON1lKs .image-shape .label,#mermaid-svg-xtx5vi5m85ON1lKs .icon-shape .label{text-anchor:middle;}#mermaid-svg-xtx5vi5m85ON1lKs .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-xtx5vi5m85ON1lKs .rough-node .label,#mermaid-svg-xtx5vi5m85ON1lKs .node .label,#mermaid-svg-xtx5vi5m85ON1lKs .image-shape .label,#mermaid-svg-xtx5vi5m85ON1lKs .icon-shape .label{text-align:center;}#mermaid-svg-xtx5vi5m85ON1lKs .node.clickable{cursor:pointer;}#mermaid-svg-xtx5vi5m85ON1lKs .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-xtx5vi5m85ON1lKs .arrowheadPath{fill:#333333;}#mermaid-svg-xtx5vi5m85ON1lKs .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-xtx5vi5m85ON1lKs .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-xtx5vi5m85ON1lKs .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xtx5vi5m85ON1lKs .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-xtx5vi5m85ON1lKs .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xtx5vi5m85ON1lKs .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-xtx5vi5m85ON1lKs .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-xtx5vi5m85ON1lKs .cluster text{fill:#333;}#mermaid-svg-xtx5vi5m85ON1lKs .cluster span{color:#333;}#mermaid-svg-xtx5vi5m85ON1lKs div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-xtx5vi5m85ON1lKs .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-xtx5vi5m85ON1lKs rect.text{fill:none;stroke-width:0;}#mermaid-svg-xtx5vi5m85ON1lKs .icon-shape,#mermaid-svg-xtx5vi5m85ON1lKs .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xtx5vi5m85ON1lKs .icon-shape p,#mermaid-svg-xtx5vi5m85ON1lKs .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-xtx5vi5m85ON1lKs .icon-shape .label rect,#mermaid-svg-xtx5vi5m85ON1lKs .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xtx5vi5m85ON1lKs .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-xtx5vi5m85ON1lKs .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-xtx5vi5m85ON1lKs :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 栈帧 Stack Frame
局部变量表
Local Variable Table
存储方法参数和局部变量
基本类型存值,引用类型存储引用指针
操作数栈
Operand Stack
字节码指令操作的数据结构
类似计算过程的草稿纸
动态链接
Dynamic Linking
指向运行时常量池中该方法的引用
返回地址
Return Address
方法正常退出或异常退出的返回位置
举例说明栈的工作过程:
java
public class StackDemo {
public static void main(String[] args) {
int a = 10; // main的局部变量表中存入 a=10
int b = 20; // main的局部变量表中存入 b=20
int result = add(a, b); // 调用add方法,创建add的栈帧
}
public static int add(int x, int y) {
int sum = x + y; // add的局部变量表中存入 sum=30
return sum; // 返回值压入main栈帧的操作数栈
} // add栈帧出栈
}
在这个例子中,当程序执行时:
- main方法的栈帧被压入虚拟机栈
- 调用add(10, 20)时,JVM创建add方法的栈帧并压入栈顶
- add方法执行完毕并返回30时,add栈帧从栈中弹出(出栈)
- 控制权回到main方法,继续执行main栈帧中的后续指令
栈内存的异常情况:
- StackOverflowError:当线程请求的栈深度大于JVM允许的最大深度时抛出。最常见的场景是无限递归调用。
- OutOfMemoryError:当虚拟机栈可以动态扩展(大多数JVM支持),但无法申请到足够内存时抛出。
java
// 这段代码会导致StackOverflowError
public class StackOverflowDemo {
public static void recursiveCall() {
recursiveCall(); // 无限递归,不断创建新的栈帧
}
public static void main(String[] args) {
recursiveCall(); // Exception in thread "main" java.lang.StackOverflowError
}
}
7.3.3 堆(Heap)
堆是JVM管理的最大一块内存区域,也是所有线程共享 的区域。它在JVM启动时被创建,其唯一目的就是存储对象实例和数组。
堆也是垃圾回收器(GC)管理的主要区域,因此也被称为"GC堆"(Garbage Collected Heap)。由于现代JVM普遍采用分代回收算法,堆可以进一步细分为:
#mermaid-svg-LcIclmUEatR6J69u{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-LcIclmUEatR6J69u .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-LcIclmUEatR6J69u .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-LcIclmUEatR6J69u .error-icon{fill:#552222;}#mermaid-svg-LcIclmUEatR6J69u .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-LcIclmUEatR6J69u .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-LcIclmUEatR6J69u .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-LcIclmUEatR6J69u .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-LcIclmUEatR6J69u .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-LcIclmUEatR6J69u .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-LcIclmUEatR6J69u .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-LcIclmUEatR6J69u .marker{fill:#333333;stroke:#333333;}#mermaid-svg-LcIclmUEatR6J69u .marker.cross{stroke:#333333;}#mermaid-svg-LcIclmUEatR6J69u svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-LcIclmUEatR6J69u p{margin:0;}#mermaid-svg-LcIclmUEatR6J69u .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-LcIclmUEatR6J69u .cluster-label text{fill:#333;}#mermaid-svg-LcIclmUEatR6J69u .cluster-label span{color:#333;}#mermaid-svg-LcIclmUEatR6J69u .cluster-label span p{background-color:transparent;}#mermaid-svg-LcIclmUEatR6J69u .label text,#mermaid-svg-LcIclmUEatR6J69u span{fill:#333;color:#333;}#mermaid-svg-LcIclmUEatR6J69u .node rect,#mermaid-svg-LcIclmUEatR6J69u .node circle,#mermaid-svg-LcIclmUEatR6J69u .node ellipse,#mermaid-svg-LcIclmUEatR6J69u .node polygon,#mermaid-svg-LcIclmUEatR6J69u .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-LcIclmUEatR6J69u .rough-node .label text,#mermaid-svg-LcIclmUEatR6J69u .node .label text,#mermaid-svg-LcIclmUEatR6J69u .image-shape .label,#mermaid-svg-LcIclmUEatR6J69u .icon-shape .label{text-anchor:middle;}#mermaid-svg-LcIclmUEatR6J69u .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-LcIclmUEatR6J69u .rough-node .label,#mermaid-svg-LcIclmUEatR6J69u .node .label,#mermaid-svg-LcIclmUEatR6J69u .image-shape .label,#mermaid-svg-LcIclmUEatR6J69u .icon-shape .label{text-align:center;}#mermaid-svg-LcIclmUEatR6J69u .node.clickable{cursor:pointer;}#mermaid-svg-LcIclmUEatR6J69u .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-LcIclmUEatR6J69u .arrowheadPath{fill:#333333;}#mermaid-svg-LcIclmUEatR6J69u .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-LcIclmUEatR6J69u .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-LcIclmUEatR6J69u .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LcIclmUEatR6J69u .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-LcIclmUEatR6J69u .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LcIclmUEatR6J69u .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-LcIclmUEatR6J69u .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-LcIclmUEatR6J69u .cluster text{fill:#333;}#mermaid-svg-LcIclmUEatR6J69u .cluster span{color:#333;}#mermaid-svg-LcIclmUEatR6J69u div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-LcIclmUEatR6J69u .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-LcIclmUEatR6J69u rect.text{fill:none;stroke-width:0;}#mermaid-svg-LcIclmUEatR6J69u .icon-shape,#mermaid-svg-LcIclmUEatR6J69u .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LcIclmUEatR6J69u .icon-shape p,#mermaid-svg-LcIclmUEatR6J69u .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-LcIclmUEatR6J69u .icon-shape .label rect,#mermaid-svg-LcIclmUEatR6J69u .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LcIclmUEatR6J69u .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-LcIclmUEatR6J69u .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-LcIclmUEatR6J69u :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Java堆 Heap
新生代 Young Generation
老年代 Old/Tenured Generation
Eden区
大多数新建对象分配在此
Survivor 0 区
From区
Survivor 1 区
To区
老年代区域
经历过多次GC仍存活的对象
大对象直接分配在此
新生代与老年代的对象流转:
- 新创建的对象首先在Eden区分配内存
- 当Eden区满了触发Minor GC(新生代垃圾回收),存活的对象被复制到Survivor区
- 对象在Survivor区中每经历一次Minor GC未被回收,其"年龄"就增加1
- 当对象年龄达到一定阈值(默认15),它会被晋升(Promotion)到老年代
- 当老年代满了触发Major GC(老年代垃圾回收),通常也伴随一次Full GC
java
// 演示堆内存使用
public class HeapDemo {
public static void main(String[] args) {
// 获取JVM堆内存信息
Runtime runtime = Runtime.getRuntime();
long totalMemory = runtime.totalMemory(); // JVM当前分配的总堆内存
long freeMemory = runtime.freeMemory(); // 当前空闲的堆内存
long maxMemory = runtime.maxMemory(); // JVM能使用的最大堆内存
System.out.println("总堆内存: " + totalMemory / 1024 / 1024 + " MB");
System.out.println("空闲堆内存: " + freeMemory / 1024 / 1024 + " MB");
System.out.println("最大堆内存: " + maxMemory / 1024 / 1024 + " MB");
// 手动申请大数组,观察内存变化
int[] largeArray = new int[10_000_000]; // 约40MB
freeMemory = runtime.freeMemory();
System.out.println("分配大数组后的空闲堆内存: " + freeMemory / 1024 / 1024 + " MB");
}
}
7.3.4 方法区/元空间(Method Area / Metaspace)
方法区也是线程共享 的内存区域,用于存储已被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码缓存等数据。
在JDK 8之前,HotSpot VM使用**永久代(PermGen)**来实现方法区。永久代是堆的一部分,拥有固定的大小上限,容易发生OutOfMemoryError: PermGen space错误。
从JDK 8开始,HotSpot VM彻底移除了永久代,改用**元空间(Metaspace)**来替代。元空间使用本地内存(操作系统内存)而不是JVM堆内存。这意味着元空间的大小仅受限于系统可用内存,默认情况下可以动态扩展,大大减少了PermGen OOM的问题。
| 项目 | 永久代(JDK 7及之前) | 元空间(JDK 8及之后) |
|---|---|---|
| 存储位置 | JVM堆内存中 | 本地内存(操作系统内存) |
| 大小限制 | 固定,默认约64MB-82MB | 默认无上限,仅受系统内存限制 |
| 主要问题 | 容易OOM: PermGen space | 默认无限制,但可能撑爆系统内存 |
| 调优参数 | -XX:PermSize / -XX:MaxPermSize | -XX:MetaspaceSize / -XX:MaxMetaspaceSize |
| 字符串常量池 | 在永久代中 | 移到堆中 |
7.4 执行引擎
执行引擎是JVM的核心部分,它负责执行字节码指令。执行引擎包含三个主要组件:
#mermaid-svg-XOPnD1D3goGrEH97{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-XOPnD1D3goGrEH97 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-XOPnD1D3goGrEH97 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-XOPnD1D3goGrEH97 .error-icon{fill:#552222;}#mermaid-svg-XOPnD1D3goGrEH97 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-XOPnD1D3goGrEH97 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-XOPnD1D3goGrEH97 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-XOPnD1D3goGrEH97 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-XOPnD1D3goGrEH97 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-XOPnD1D3goGrEH97 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-XOPnD1D3goGrEH97 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-XOPnD1D3goGrEH97 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-XOPnD1D3goGrEH97 .marker.cross{stroke:#333333;}#mermaid-svg-XOPnD1D3goGrEH97 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-XOPnD1D3goGrEH97 p{margin:0;}#mermaid-svg-XOPnD1D3goGrEH97 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-XOPnD1D3goGrEH97 .cluster-label text{fill:#333;}#mermaid-svg-XOPnD1D3goGrEH97 .cluster-label span{color:#333;}#mermaid-svg-XOPnD1D3goGrEH97 .cluster-label span p{background-color:transparent;}#mermaid-svg-XOPnD1D3goGrEH97 .label text,#mermaid-svg-XOPnD1D3goGrEH97 span{fill:#333;color:#333;}#mermaid-svg-XOPnD1D3goGrEH97 .node rect,#mermaid-svg-XOPnD1D3goGrEH97 .node circle,#mermaid-svg-XOPnD1D3goGrEH97 .node ellipse,#mermaid-svg-XOPnD1D3goGrEH97 .node polygon,#mermaid-svg-XOPnD1D3goGrEH97 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-XOPnD1D3goGrEH97 .rough-node .label text,#mermaid-svg-XOPnD1D3goGrEH97 .node .label text,#mermaid-svg-XOPnD1D3goGrEH97 .image-shape .label,#mermaid-svg-XOPnD1D3goGrEH97 .icon-shape .label{text-anchor:middle;}#mermaid-svg-XOPnD1D3goGrEH97 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-XOPnD1D3goGrEH97 .rough-node .label,#mermaid-svg-XOPnD1D3goGrEH97 .node .label,#mermaid-svg-XOPnD1D3goGrEH97 .image-shape .label,#mermaid-svg-XOPnD1D3goGrEH97 .icon-shape .label{text-align:center;}#mermaid-svg-XOPnD1D3goGrEH97 .node.clickable{cursor:pointer;}#mermaid-svg-XOPnD1D3goGrEH97 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-XOPnD1D3goGrEH97 .arrowheadPath{fill:#333333;}#mermaid-svg-XOPnD1D3goGrEH97 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-XOPnD1D3goGrEH97 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-XOPnD1D3goGrEH97 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-XOPnD1D3goGrEH97 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-XOPnD1D3goGrEH97 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-XOPnD1D3goGrEH97 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-XOPnD1D3goGrEH97 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-XOPnD1D3goGrEH97 .cluster text{fill:#333;}#mermaid-svg-XOPnD1D3goGrEH97 .cluster span{color:#333;}#mermaid-svg-XOPnD1D3goGrEH97 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-XOPnD1D3goGrEH97 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-XOPnD1D3goGrEH97 rect.text{fill:none;stroke-width:0;}#mermaid-svg-XOPnD1D3goGrEH97 .icon-shape,#mermaid-svg-XOPnD1D3goGrEH97 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-XOPnD1D3goGrEH97 .icon-shape p,#mermaid-svg-XOPnD1D3goGrEH97 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-XOPnD1D3goGrEH97 .icon-shape .label rect,#mermaid-svg-XOPnD1D3goGrEH97 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-XOPnD1D3goGrEH97 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-XOPnD1D3goGrEH97 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-XOPnD1D3goGrEH97 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 逐条解释
热点代码编译为本地码
编译产物
直接执行
自动回收内存
字节码指令
解释器 Interpreter
JIT编译器
Just-In-Time Compiler
程序执行结果
代码缓存
Code Cache
垃圾回收器 GC
堆内存
解释器(Interpreter):将字节码指令逐条翻译为本地机器指令并执行。优点是启动快、无需等待编译,缺点是执行效率相对较低。
JIT编译器(Just-In-Time Compiler):将热点代码(被频繁执行的方法或循环体)直接编译为本地机器码,之后这些代码就可以直接由CPU执行,而不需要再经过解释过程。HotSpot VM中有两种JIT编译器:
- C1(Client Compiler):编译速度快,但优化程度较低。适合需要快速启动的桌面应用。
- C2(Server Compiler):编译速度慢,但优化程度更高,生成的机器码执行效率更高。适合长时间运行的服务器应用。
JDK 7以后引入了**分层编译(Tiered Compilation)**策略,结合了C1和C2的优点:
级别0: 解释执行(不编译)
级别1: C1编译,无profiling数据
级别2: C1编译,带简单profiling(方法调用次数、循环回边次数)
级别3: C1编译,带完整profiling(分支预测、类型分析)
级别4: C2编译,使用C1收集的profiling数据进行激进优化
垃圾回收器(Garbage Collector, GC):自动管理堆内存,回收不再被引用的对象。程序员无需手动释放内存,大大降低了内存泄漏和安全漏洞的风险。关于GC的详细内容,后续会有专门的文章进行深入讲解。
7.5 本地方法接口(JNI)
JNI(Java Native Interface,Java本地方法接口)是Java与其他编程语言(主要是C/C++)交互的桥梁。当Java程序需要调用操作系统底层功能或使用已有的C/C++库时,可以通过JNI来实现。
java
// 声明一个本地方法
public class NativeDemo {
// native关键字表示这是一个本地方法,由C/C++实现
public native void helloNative();
static {
// 加载包含本地方法实现的动态链接库
System.loadLibrary("NativeDemo");
}
public static void main(String[] args) {
new NativeDemo().helloNative();
}
}
底层操作系统的许多功能(如线程调度、文件系统操作、网络通信等)最终都是通过JNI调用本地方法实现的。JDK核心类库中大量使用了native方法,例如:
Object.hashCode()方法声明为nativeThread.start()方法底层调用了native方法start0()Class.forName()方法底层调用了native方法forName0()
八、JDK发行版的选择
8.1 主流JDK发行版对比
有了JDK、JRE、JVM的概念基础之后,你还需要了解一个重要的事实:不只存在一种JDK。市面上有多种遵循Java规范的JDK发行版,你需要根据自己的需求来选择合适的版本。
#mermaid-svg-vwnQO85oR9F97JJW{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-vwnQO85oR9F97JJW .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-vwnQO85oR9F97JJW .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-vwnQO85oR9F97JJW .error-icon{fill:#552222;}#mermaid-svg-vwnQO85oR9F97JJW .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-vwnQO85oR9F97JJW .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-vwnQO85oR9F97JJW .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-vwnQO85oR9F97JJW .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-vwnQO85oR9F97JJW .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-vwnQO85oR9F97JJW .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-vwnQO85oR9F97JJW .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-vwnQO85oR9F97JJW .marker{fill:#333333;stroke:#333333;}#mermaid-svg-vwnQO85oR9F97JJW .marker.cross{stroke:#333333;}#mermaid-svg-vwnQO85oR9F97JJW svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-vwnQO85oR9F97JJW p{margin:0;}#mermaid-svg-vwnQO85oR9F97JJW .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-vwnQO85oR9F97JJW .cluster-label text{fill:#333;}#mermaid-svg-vwnQO85oR9F97JJW .cluster-label span{color:#333;}#mermaid-svg-vwnQO85oR9F97JJW .cluster-label span p{background-color:transparent;}#mermaid-svg-vwnQO85oR9F97JJW .label text,#mermaid-svg-vwnQO85oR9F97JJW span{fill:#333;color:#333;}#mermaid-svg-vwnQO85oR9F97JJW .node rect,#mermaid-svg-vwnQO85oR9F97JJW .node circle,#mermaid-svg-vwnQO85oR9F97JJW .node ellipse,#mermaid-svg-vwnQO85oR9F97JJW .node polygon,#mermaid-svg-vwnQO85oR9F97JJW .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-vwnQO85oR9F97JJW .rough-node .label text,#mermaid-svg-vwnQO85oR9F97JJW .node .label text,#mermaid-svg-vwnQO85oR9F97JJW .image-shape .label,#mermaid-svg-vwnQO85oR9F97JJW .icon-shape .label{text-anchor:middle;}#mermaid-svg-vwnQO85oR9F97JJW .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-vwnQO85oR9F97JJW .rough-node .label,#mermaid-svg-vwnQO85oR9F97JJW .node .label,#mermaid-svg-vwnQO85oR9F97JJW .image-shape .label,#mermaid-svg-vwnQO85oR9F97JJW .icon-shape .label{text-align:center;}#mermaid-svg-vwnQO85oR9F97JJW .node.clickable{cursor:pointer;}#mermaid-svg-vwnQO85oR9F97JJW .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-vwnQO85oR9F97JJW .arrowheadPath{fill:#333333;}#mermaid-svg-vwnQO85oR9F97JJW .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-vwnQO85oR9F97JJW .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-vwnQO85oR9F97JJW .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vwnQO85oR9F97JJW .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-vwnQO85oR9F97JJW .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vwnQO85oR9F97JJW .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-vwnQO85oR9F97JJW .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-vwnQO85oR9F97JJW .cluster text{fill:#333;}#mermaid-svg-vwnQO85oR9F97JJW .cluster span{color:#333;}#mermaid-svg-vwnQO85oR9F97JJW div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-vwnQO85oR9F97JJW .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-vwnQO85oR9F97JJW rect.text{fill:none;stroke-width:0;}#mermaid-svg-vwnQO85oR9F97JJW .icon-shape,#mermaid-svg-vwnQO85oR9F97JJW .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vwnQO85oR9F97JJW .icon-shape p,#mermaid-svg-vwnQO85oR9F97JJW .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-vwnQO85oR9F97JJW .icon-shape .label rect,#mermaid-svg-vwnQO85oR9F97JJW .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vwnQO85oR9F97JJW .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-vwnQO85oR9F97JJW .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-vwnQO85oR9F97JJW :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 衍生出
衍生出
衍生出
衍生出
衍生出
衍生出
衍生出
OpenJDK
开源参考实现
Oracle JDK
Oracle官方维护
Azul Zulu
免费、面向企业
Adoptium Eclipse Temurin
社区驱动、免费
Amazon Corretto
AWS优化、免费
Microsoft Build of OpenJDK
Azure优化、免费
BellSoft Liberica JDK
包含JavaFX
Red Hat Build of OpenJDK
企业级支持
| JDK发行版 | 维护方 | 免费/收费 | 特点 | 适用场景 |
|---|---|---|---|---|
| Oracle JDK | Oracle | 开发测试免费/生产环境收费(JDK 17后) | Oracle官方发布,更新最快 | 付费企业用户 |
| OpenJDK | Oracle/社区 | 完全免费开源 | 所有发行版的源头 | 各类场景 |
| Adoptium Temurin | Eclipse基金会 | 完全免费 | 社区广泛使用,可信赖 | 企业生产环境首选 |
| Amazon Corretto | Amazon | 完全免费 | AWS优化,Amazon长期支持 | AWS云环境 |
| Azul Zulu | Azul | 部分免费 | 支持广泛平台,包括旧版本 | 嵌入式/金融系统 |
| Microsoft OpenJDK | Microsoft | 完全免费 | Azure集成优化 | Azure云环境 |
| BellSoft Liberica | BellSoft | 社区版免费 | 内嵌JavaFX运行时 | 需要JavaFX的桌面应用 |
| GraalVM | Oracle | 社区版免费/企业版收费 | 多语言支持,AOT编译 | 云原生/微服务 |
8.2 Oracle JDK vs OpenJDK
这是一个被问到最多的问题。两者的核心关系如下:
OpenJDK是Java SE(Standard Edition)的开源参考实现,是Java规范的"标准答案"。从JDK 7开始,OpenJDK就成为了Java开发的官方参考实现。
Oracle JDK是基于OpenJDK构建的Oracle官方发行版。在JDK 11之前,Oracle JDK包含了一些OpenJDK没有的商业特性(如Java Flight Recorder、Java Mission Control等)。但从JDK 11开始,Oracle和OpenJDK社区共同推进了两者的一致性,两个版本变得几乎完全相同。
| 对比维度 | Oracle JDK | OpenJDK |
|---|---|---|
| 许可证 | Oracle Technology Network License (OTN) | GPL v2 + Classpath Exception |
| 更新周期 | 更快获得安全补丁 | 稍慢,通过社区发布 |
| 性能 | 基本相同 | 基本相同 |
| 功能 | 基本相同(JDK 11+) | 基本相同 |
| 安装包 | 提供安装器(.exe/.dmg) | 通常为压缩包(.tar.gz/.zip) |
| 使用限制 | 生产环境需付费(JDK 17+) | 完全免费 |
8.3 如何选择适合自己的JDK?
对于大多数Java初学者和开发者来说,选择建议如下:
场景一:个人学习/开源项目
推荐Adoptium Eclipse Temurin 或Amazon Corretto。两者完全免费,更新及时,安装方便,有无可挑剔的兼容性。
场景二:企业生产环境
如果公司有Oracle授权预算,可以考虑Oracle JDK获取官方技术支持。否则,Adoptium Temurin和Amazon Corretto都是经过大型企业验证的可靠选择。
场景三:运行在AWS云上的应用
推荐Amazon Corretto。它经过了Amazon内部成千上万台服务器的验证,与AWS服务集成最佳,且Amazon承诺提供长期免费的更新支持。
场景四:开发JavaFX桌面应用
推荐BellSoft Liberica JDK。这是目前为数不多的内置JavaFX运行时的JDK发行版。
场景五:微服务/容器化部署
可以考虑GraalVM。它支持Native Image技术,可以将Java应用编译为独立的本地可执行文件,启动速度极快,内存占用极低,非常适合Serverless和容器场景。
九、JDK/JRE打包方式的历史变化
9.1 JDK版本与JRE的演变
随着Java版本的发展,JDK和JRE的打包方式经历了多次重大变化。了解这一演变过程,可以帮助你理解为什么在不同版本的JDK中看到的目录结构不太一样。
#mermaid-svg-dA4djD5KpT96NsPZ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-dA4djD5KpT96NsPZ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-dA4djD5KpT96NsPZ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-dA4djD5KpT96NsPZ .error-icon{fill:#552222;}#mermaid-svg-dA4djD5KpT96NsPZ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-dA4djD5KpT96NsPZ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-dA4djD5KpT96NsPZ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-dA4djD5KpT96NsPZ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-dA4djD5KpT96NsPZ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-dA4djD5KpT96NsPZ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-dA4djD5KpT96NsPZ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-dA4djD5KpT96NsPZ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-dA4djD5KpT96NsPZ .marker.cross{stroke:#333333;}#mermaid-svg-dA4djD5KpT96NsPZ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-dA4djD5KpT96NsPZ p{margin:0;}#mermaid-svg-dA4djD5KpT96NsPZ .edge{stroke-width:3;}#mermaid-svg-dA4djD5KpT96NsPZ .section--1 rect,#mermaid-svg-dA4djD5KpT96NsPZ .section--1 path,#mermaid-svg-dA4djD5KpT96NsPZ .section--1 circle,#mermaid-svg-dA4djD5KpT96NsPZ .section--1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-dA4djD5KpT96NsPZ .section--1 text{fill:#ffffff;}#mermaid-svg-dA4djD5KpT96NsPZ .node-icon--1{font-size:40px;color:#ffffff;}#mermaid-svg-dA4djD5KpT96NsPZ .section-edge--1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-dA4djD5KpT96NsPZ .edge-depth--1{stroke-width:17;}#mermaid-svg-dA4djD5KpT96NsPZ .section--1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-dA4djD5KpT96NsPZ .lineWrapper line{stroke:#ffffff;}#mermaid-svg-dA4djD5KpT96NsPZ .disabled,#mermaid-svg-dA4djD5KpT96NsPZ .disabled circle,#mermaid-svg-dA4djD5KpT96NsPZ .disabled text{fill:lightgray;}#mermaid-svg-dA4djD5KpT96NsPZ .disabled text{fill:#efefef;}#mermaid-svg-dA4djD5KpT96NsPZ .section-0 rect,#mermaid-svg-dA4djD5KpT96NsPZ .section-0 path,#mermaid-svg-dA4djD5KpT96NsPZ .section-0 circle,#mermaid-svg-dA4djD5KpT96NsPZ .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-dA4djD5KpT96NsPZ .section-0 text{fill:black;}#mermaid-svg-dA4djD5KpT96NsPZ .node-icon-0{font-size:40px;color:black;}#mermaid-svg-dA4djD5KpT96NsPZ .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-dA4djD5KpT96NsPZ .edge-depth-0{stroke-width:14;}#mermaid-svg-dA4djD5KpT96NsPZ .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-dA4djD5KpT96NsPZ .lineWrapper line{stroke:black;}#mermaid-svg-dA4djD5KpT96NsPZ .disabled,#mermaid-svg-dA4djD5KpT96NsPZ .disabled circle,#mermaid-svg-dA4djD5KpT96NsPZ .disabled text{fill:lightgray;}#mermaid-svg-dA4djD5KpT96NsPZ .disabled text{fill:#efefef;}#mermaid-svg-dA4djD5KpT96NsPZ .section-1 rect,#mermaid-svg-dA4djD5KpT96NsPZ .section-1 path,#mermaid-svg-dA4djD5KpT96NsPZ .section-1 circle,#mermaid-svg-dA4djD5KpT96NsPZ .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-dA4djD5KpT96NsPZ .section-1 text{fill:black;}#mermaid-svg-dA4djD5KpT96NsPZ .node-icon-1{font-size:40px;color:black;}#mermaid-svg-dA4djD5KpT96NsPZ .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-dA4djD5KpT96NsPZ .edge-depth-1{stroke-width:11;}#mermaid-svg-dA4djD5KpT96NsPZ .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-dA4djD5KpT96NsPZ .lineWrapper line{stroke:black;}#mermaid-svg-dA4djD5KpT96NsPZ .disabled,#mermaid-svg-dA4djD5KpT96NsPZ .disabled circle,#mermaid-svg-dA4djD5KpT96NsPZ .disabled text{fill:lightgray;}#mermaid-svg-dA4djD5KpT96NsPZ .disabled text{fill:#efefef;}#mermaid-svg-dA4djD5KpT96NsPZ .section-2 rect,#mermaid-svg-dA4djD5KpT96NsPZ .section-2 path,#mermaid-svg-dA4djD5KpT96NsPZ .section-2 circle,#mermaid-svg-dA4djD5KpT96NsPZ .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-dA4djD5KpT96NsPZ .section-2 text{fill:#ffffff;}#mermaid-svg-dA4djD5KpT96NsPZ .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-dA4djD5KpT96NsPZ .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-dA4djD5KpT96NsPZ .edge-depth-2{stroke-width:8;}#mermaid-svg-dA4djD5KpT96NsPZ .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-dA4djD5KpT96NsPZ .lineWrapper line{stroke:#ffffff;}#mermaid-svg-dA4djD5KpT96NsPZ .disabled,#mermaid-svg-dA4djD5KpT96NsPZ .disabled circle,#mermaid-svg-dA4djD5KpT96NsPZ .disabled text{fill:lightgray;}#mermaid-svg-dA4djD5KpT96NsPZ .disabled text{fill:#efefef;}#mermaid-svg-dA4djD5KpT96NsPZ .section-3 rect,#mermaid-svg-dA4djD5KpT96NsPZ .section-3 path,#mermaid-svg-dA4djD5KpT96NsPZ .section-3 circle,#mermaid-svg-dA4djD5KpT96NsPZ .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-dA4djD5KpT96NsPZ .section-3 text{fill:black;}#mermaid-svg-dA4djD5KpT96NsPZ .node-icon-3{font-size:40px;color:black;}#mermaid-svg-dA4djD5KpT96NsPZ .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-dA4djD5KpT96NsPZ .edge-depth-3{stroke-width:5;}#mermaid-svg-dA4djD5KpT96NsPZ .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-dA4djD5KpT96NsPZ .lineWrapper line{stroke:black;}#mermaid-svg-dA4djD5KpT96NsPZ .disabled,#mermaid-svg-dA4djD5KpT96NsPZ .disabled circle,#mermaid-svg-dA4djD5KpT96NsPZ .disabled text{fill:lightgray;}#mermaid-svg-dA4djD5KpT96NsPZ .disabled text{fill:#efefef;}#mermaid-svg-dA4djD5KpT96NsPZ .section-4 rect,#mermaid-svg-dA4djD5KpT96NsPZ .section-4 path,#mermaid-svg-dA4djD5KpT96NsPZ .section-4 circle,#mermaid-svg-dA4djD5KpT96NsPZ .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-dA4djD5KpT96NsPZ .section-4 text{fill:black;}#mermaid-svg-dA4djD5KpT96NsPZ .node-icon-4{font-size:40px;color:black;}#mermaid-svg-dA4djD5KpT96NsPZ .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-dA4djD5KpT96NsPZ .edge-depth-4{stroke-width:2;}#mermaid-svg-dA4djD5KpT96NsPZ .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-dA4djD5KpT96NsPZ .lineWrapper line{stroke:black;}#mermaid-svg-dA4djD5KpT96NsPZ .disabled,#mermaid-svg-dA4djD5KpT96NsPZ .disabled circle,#mermaid-svg-dA4djD5KpT96NsPZ .disabled text{fill:lightgray;}#mermaid-svg-dA4djD5KpT96NsPZ .disabled text{fill:#efefef;}#mermaid-svg-dA4djD5KpT96NsPZ .section-5 rect,#mermaid-svg-dA4djD5KpT96NsPZ .section-5 path,#mermaid-svg-dA4djD5KpT96NsPZ .section-5 circle,#mermaid-svg-dA4djD5KpT96NsPZ .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-dA4djD5KpT96NsPZ .section-5 text{fill:black;}#mermaid-svg-dA4djD5KpT96NsPZ .node-icon-5{font-size:40px;color:black;}#mermaid-svg-dA4djD5KpT96NsPZ .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-dA4djD5KpT96NsPZ .edge-depth-5{stroke-width:-1;}#mermaid-svg-dA4djD5KpT96NsPZ .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-dA4djD5KpT96NsPZ .lineWrapper line{stroke:black;}#mermaid-svg-dA4djD5KpT96NsPZ .disabled,#mermaid-svg-dA4djD5KpT96NsPZ .disabled circle,#mermaid-svg-dA4djD5KpT96NsPZ .disabled text{fill:lightgray;}#mermaid-svg-dA4djD5KpT96NsPZ .disabled text{fill:#efefef;}#mermaid-svg-dA4djD5KpT96NsPZ .section-6 rect,#mermaid-svg-dA4djD5KpT96NsPZ .section-6 path,#mermaid-svg-dA4djD5KpT96NsPZ .section-6 circle,#mermaid-svg-dA4djD5KpT96NsPZ .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-dA4djD5KpT96NsPZ .section-6 text{fill:black;}#mermaid-svg-dA4djD5KpT96NsPZ .node-icon-6{font-size:40px;color:black;}#mermaid-svg-dA4djD5KpT96NsPZ .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-dA4djD5KpT96NsPZ .edge-depth-6{stroke-width:-4;}#mermaid-svg-dA4djD5KpT96NsPZ .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-dA4djD5KpT96NsPZ .lineWrapper line{stroke:black;}#mermaid-svg-dA4djD5KpT96NsPZ .disabled,#mermaid-svg-dA4djD5KpT96NsPZ .disabled circle,#mermaid-svg-dA4djD5KpT96NsPZ .disabled text{fill:lightgray;}#mermaid-svg-dA4djD5KpT96NsPZ .disabled text{fill:#efefef;}#mermaid-svg-dA4djD5KpT96NsPZ .section-7 rect,#mermaid-svg-dA4djD5KpT96NsPZ .section-7 path,#mermaid-svg-dA4djD5KpT96NsPZ .section-7 circle,#mermaid-svg-dA4djD5KpT96NsPZ .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-dA4djD5KpT96NsPZ .section-7 text{fill:black;}#mermaid-svg-dA4djD5KpT96NsPZ .node-icon-7{font-size:40px;color:black;}#mermaid-svg-dA4djD5KpT96NsPZ .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-dA4djD5KpT96NsPZ .edge-depth-7{stroke-width:-7;}#mermaid-svg-dA4djD5KpT96NsPZ .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-dA4djD5KpT96NsPZ .lineWrapper line{stroke:black;}#mermaid-svg-dA4djD5KpT96NsPZ .disabled,#mermaid-svg-dA4djD5KpT96NsPZ .disabled circle,#mermaid-svg-dA4djD5KpT96NsPZ .disabled text{fill:lightgray;}#mermaid-svg-dA4djD5KpT96NsPZ .disabled text{fill:#efefef;}#mermaid-svg-dA4djD5KpT96NsPZ .section-8 rect,#mermaid-svg-dA4djD5KpT96NsPZ .section-8 path,#mermaid-svg-dA4djD5KpT96NsPZ .section-8 circle,#mermaid-svg-dA4djD5KpT96NsPZ .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-dA4djD5KpT96NsPZ .section-8 text{fill:black;}#mermaid-svg-dA4djD5KpT96NsPZ .node-icon-8{font-size:40px;color:black;}#mermaid-svg-dA4djD5KpT96NsPZ .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-dA4djD5KpT96NsPZ .edge-depth-8{stroke-width:-10;}#mermaid-svg-dA4djD5KpT96NsPZ .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-dA4djD5KpT96NsPZ .lineWrapper line{stroke:black;}#mermaid-svg-dA4djD5KpT96NsPZ .disabled,#mermaid-svg-dA4djD5KpT96NsPZ .disabled circle,#mermaid-svg-dA4djD5KpT96NsPZ .disabled text{fill:lightgray;}#mermaid-svg-dA4djD5KpT96NsPZ .disabled text{fill:#efefef;}#mermaid-svg-dA4djD5KpT96NsPZ .section-9 rect,#mermaid-svg-dA4djD5KpT96NsPZ .section-9 path,#mermaid-svg-dA4djD5KpT96NsPZ .section-9 circle,#mermaid-svg-dA4djD5KpT96NsPZ .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-dA4djD5KpT96NsPZ .section-9 text{fill:black;}#mermaid-svg-dA4djD5KpT96NsPZ .node-icon-9{font-size:40px;color:black;}#mermaid-svg-dA4djD5KpT96NsPZ .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-dA4djD5KpT96NsPZ .edge-depth-9{stroke-width:-13;}#mermaid-svg-dA4djD5KpT96NsPZ .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-dA4djD5KpT96NsPZ .lineWrapper line{stroke:black;}#mermaid-svg-dA4djD5KpT96NsPZ .disabled,#mermaid-svg-dA4djD5KpT96NsPZ .disabled circle,#mermaid-svg-dA4djD5KpT96NsPZ .disabled text{fill:lightgray;}#mermaid-svg-dA4djD5KpT96NsPZ .disabled text{fill:#efefef;}#mermaid-svg-dA4djD5KpT96NsPZ .section-10 rect,#mermaid-svg-dA4djD5KpT96NsPZ .section-10 path,#mermaid-svg-dA4djD5KpT96NsPZ .section-10 circle,#mermaid-svg-dA4djD5KpT96NsPZ .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-dA4djD5KpT96NsPZ .section-10 text{fill:black;}#mermaid-svg-dA4djD5KpT96NsPZ .node-icon-10{font-size:40px;color:black;}#mermaid-svg-dA4djD5KpT96NsPZ .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-dA4djD5KpT96NsPZ .edge-depth-10{stroke-width:-16;}#mermaid-svg-dA4djD5KpT96NsPZ .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-dA4djD5KpT96NsPZ .lineWrapper line{stroke:black;}#mermaid-svg-dA4djD5KpT96NsPZ .disabled,#mermaid-svg-dA4djD5KpT96NsPZ .disabled circle,#mermaid-svg-dA4djD5KpT96NsPZ .disabled text{fill:lightgray;}#mermaid-svg-dA4djD5KpT96NsPZ .disabled text{fill:#efefef;}#mermaid-svg-dA4djD5KpT96NsPZ .section-root rect,#mermaid-svg-dA4djD5KpT96NsPZ .section-root path,#mermaid-svg-dA4djD5KpT96NsPZ .section-root circle{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-dA4djD5KpT96NsPZ .section-root text{fill:#ffffff;}#mermaid-svg-dA4djD5KpT96NsPZ .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-dA4djD5KpT96NsPZ .edge{fill:none;}#mermaid-svg-dA4djD5KpT96NsPZ .eventWrapper{filter:brightness(120%);}#mermaid-svg-dA4djD5KpT96NsPZ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 1996-2010 JDK包含独立JRE目录 典型的JDK/jre目录结构 2011-2017 JDK 7/8延续独立JRE JRE作为JDK的子目录 2018 JDK 11 不再发布独立JRE 引入jlink创建定制JRE 2020 JDK 14 jpackage工具孵化为正式功能 支持创建原生安装包 2021 JDK 17 完整的现代JDK结构 无独立JRE,使用jlink 2023-2026 JDK 21/24 持续优化模块化结构 JDK/JRE打包方式演变
9.2 JDK 8及之前:独立的JRE目录
在JDK 8及更早的版本中,JDK的安装目录结构非常清晰。你可以同时看到JDK和JRE作为两个独立的组件存在:
JDK 8 安装目录结构(Windows):
C:\Program Files\Java\
├── jdk1.8.0_202\ ← JDK安装根目录
│ ├── bin\ ← JDK开发工具(javac.exe, jar.exe等)
│ ├── db\ ← Apache Derby数据库
│ ├── include\ ← JNI开发的头文件
│ ├── jre\ ← ★ JDK自带的JRE(供开发使用)
│ │ ├── bin\ ← JRE运行时(java.exe, javaw.exe)
│ │ │ └── server\ ← HotSpot Server VM (jvm.dll)
│ │ └── lib\ ← JRE核心类库(rt.jar等)
│ ├── lib\ ← JDK开发工具库
│ └── src.zip ← Java源代码
└── jre1.8.0_202\ ← ★ 独立的公共JRE(public JRE,供所有程序运行)
├── bin\
└── lib\
在这个时代:
- JDK安装目录下有自己的私有JRE(位于jdk/jre/目录下),供JDK自身的开发工具使用
- 安装过程中还会安装一个独立的公共JRE(Public JRE),注册到操作系统,供所有Java程序运行
- 独立JRE的安装包可以单独下载和安装,大小约50-70MB
- 服务端部署时通常只安装JRE(不安装完整JDK)
9.3 JDK 9-10:模块化过渡期
JDK 9引入了Java平台模块系统(Project Jigsaw),这是Java平台架构的一次根本性变革。核心类库被拆分成了多个模块(module),rt.jar这个庞然大物被移除。
JDK 9/10 安装目录结构:
jdk-9.0.4\
├── bin\ ← 开发与运行工具合并
├── conf\ ← JDK配置目录(新增)
├── include\ ← JNI头文件
├── jmods\ ← ★ JMod模块文件(替代了jre/lib)
├── legal\ ← 各模块的许可证信息
└── lib\ ← JDK运行库
主要变化:
- 不再有独立的jre/子目录
rt.jar被删除,核心类库以jmod格式存储在jmods/目录中- JDK 9仍然可以下载独立的JRE,但JRE也是模块化的
- 引入了
jlink工具,允许开发者创建定制化的JRE
9.4 JDK 11及以后:无独立JRE
从JDK 11(LTS)开始,Oracle官方不再发布独立的JRE安装包。这是一个重大变化,意味着:
-
开发者需要部署应用程序时,要么使用完整的JDK(体积更大),要么使用
jlink工具创建一个精简的定制运行时。 -
OpenJDK也同步停止发布独立JRE。
JDK 11+ 安装目录结构:
jdk-17.0.8
├── bin\ ← 所有工具都在这里
├── conf\ ← 配置目录
├── include\ ← JNI头文件
├── jmods\ ← 模块文件
├── legal\ ← 许可证
└── lib\ ← JDK运行库
jlink工具的使用:
bash
# 创建一个只包含java.base模块的最小运行时
jlink --module-path jmods --add-modules java.base --output my-custom-jre
# 创建一个包含多个常用模块的运行时
jlink --module-path jmods \
--add-modules java.base,java.sql,java.net.http,java.xml \
--output my-app-runtime
# 查看自定义运行时大小
du -sh my-custom-jre # 约40MB
du -sh my-app-runtime # 约50MB
# 完整JDK的大小约为300MB+
jpackage工具(JDK 14+):
bash
# 将Java应用打包为Windows .exe安装包
jpackage --input target/ \
--name MyApp \
--main-jar myapp.jar \
--main-class com.example.Main \
--type exe
# 打包为macOS .dmg安装包
jpackage --input target/ \
--name MyApp \
--main-jar myapp.jar \
--main-class com.example.Main \
--type dmg
9.5 版本变化对开发者的影响
| 变化 | 影响 | 应对策略 |
|---|---|---|
| 无独立JRE发布 | 不能像以前那样在服务器上只安装轻量的JRE | 使用jlink创建定制运行时,或接受使用完整JDK |
| rt.jar移除 | 不能像以前那样直接把rt.jar加入bootclasspath | 使用模块路径或接受平台自动处理 |
| 模块化 | 代码内部结构的访问受到更严格的封装 | 如果有反射访问内部API的代码,需要添加--add-opens参数 |
| jlink/jpackage | 为应用程序打包和部署提供了新的可能性 | 学习新工具,利用它们优化部署流程 |
十、总结与展望
10.1 核心知识点回顾
让我们用一个简洁的公式来总结本文的核心内容:
- JDK = JRE + 开发工具集
- JRE = JVM + Java核心类库 + 运行时支持
- JVM = 类加载器 + 运行时数据区(栈、堆、方法区、PC寄存器、本地方法栈)+ 执行引擎(解释器、JIT编译器、GC)
这三者共同构成了Java平台的生命力。Java之所以能够在近三十年时间里始终保持技术领先地位,正是因为这套精心设计的架构------它将开发和运行、跨平台能力和本地性能、自动化内存管理和开发者控制权有机地结合在了一起。
10.2 深入学习的下一步
理解了JDK、JRE、JVM的区别,你就掌握了解开Java平台底层之谜的钥匙。但这只是一个开始。在接下来的学习旅程中,你还可以深入探索以下相关领域:
- 垃圾回收(GC)机制:了解各种GC算法的原理和调优方法
- JVM性能调优:掌握JVM参数设置、内存分析、线程分析等实战技能
- 类加载机制深入:学习自定义类加载器、OSGi框架等高级话题
- 字节码与ASM:直接操作字节码,理解底层运行逻辑
这些知识将使你从一个"会用Java"的程序员,逐步成长为一个"理解Java"的工程师。
本章关键词回顾
| 关键词 | 说明 |
|---|---|
| JDK | Java Development Kit,Java开发工具包,包含JRE和开发工具 |
| JRE | Java Runtime Environment,Java运行环境,包含JVM和核心类库 |
| JVM | Java Virtual Machine,Java虚拟机,执行字节码的软件引擎 |
| javac | JDK中的编译器,将.java源文件编译为.class字节码 |
| 字节码(Bytecode) | JVM能理解的中间代码格式,平台无关 |
| ClassLoader | 类加载器,负责将.class文件加载到JVM中 |
| 双亲委派模型 | 类加载器的工作模式,防止核心类库被篡改 |
| 堆(Heap) | JVM中存储对象实例的内存区域,线程共享,GC管理 |
| 栈(Stack) | 每个线程私有的内存区域,存储方法调用的栈帧 |
| 方法区/元空间 | 存储类信息、常量、静态变量的内存区域(JDK 8后为Metaspace) |
| JIT | Just-In-Time Compiler,将热点代码编译为本地机器码 |
| GC | Garbage Collector,垃圾回收器,自动回收不再使用的对象 |
| OpenJDK | Java SE的开源参考实现,所有JDK发行版的源头 |
| HotSpot VM | Oracle/Sun开发的主流JVM实现,JDK的默认虚拟机 |
| JNI | Java Native Interface,Java调用本地C/C++代码的接口 |
| jlink | JDK 9+的工具,用于创建定制化的JRE |
| jpackage | JDK 14+的工具,用于创建原生安装包(.exe/.dmg/.deb) |
思考与练习
-
用自己的话描述JDK、JRE、JVM三者之间的关系,并画一张包含关系图。图中应标注每个部分的主要组件。
-
请详细描述一段Java程序(从.java源代码开始)到最终在计算机上执行结果输出的完整过程,涵盖至少8个步骤。
-
JVM的双亲委派模型是什么?它为什么能保证Java核心类库的安全?请结合一个具体的恶意攻击场景来说明。
-
在JVM运行时数据区中,哪些区域是线程私有的,哪些是线程共享的?分别说明它们各自的作用。
-
编写一段会产生StackOverflowError的代码,解释错误产生的原因。然后编写一段可能产生OutOfMemoryError(堆内存溢出)的代码,并思考两者的根本区别。
-
在你当前的开发环境中,执行
java -version命令,记录输出的JVM名称和版本号。然后编写一个简单的Java程序,使用Runtime.getRuntime()打印出JVM的内存信息。 -
对比Oracle JDK和OpenJDK的区别。如果你需要在公司生产环境中部署一个Java应用,你会选择哪个发行版?说明理由(考虑成本、稳定性、安全性等因素)。
-
JDK 8和JDK 17在目录结构和打包方式上有哪些主要区别?jlink工具的作用是什么?试着使用jlink创建一个包含java.base模块的最小运行时,记录它的大小。
下一篇文章:《Java开发环境搭建:从JDK安装到Hello World》,我们将动手实践JDK的下载、安装和环境配置,编写并运行你的第一个Java程序。