说清 `JDK`、`JRE`、`JVM` 的三层包含关系
覆盖章节:说清 JDK、JRE、JVM 的三层包含关系。JDK 是开发工具包,内含 JRE;JRE 是运行环境,内含 JVM 和类库;JVM 执行 .class。它解决开发与运行职责混淆问题,机制是编译工具在外、运行虚拟机在内,误区是把三者当并列组件。
诊断题
- 面试让你画出
JDK、JRE、JVM的关系时,为什么不能只说都是Java环境,而要说明包含层级和职责?2) 线上只部署JRE能否完成编译,缺少javac会暴露什么边界?
答案骨架
我能1) 先说 JDK 面向开发,包含 javac、java 等工具;2) 再说 JRE 面向运行,包含标准类库和 JVM;3) 说明 .class 真正在 JVM 上执行;4) 区分编译期与运行期;5) 避免把 JRE 误认为可替代完整开发环境。
边界追问
- 如果容器镜像只放
JRE,构建和运行阶段该怎样拆分,故障排查要额外补哪些工具?2) 如果开发机有多个JDK,PATH中的java与javac版本不一致会怎样诊断?
边界答案
只运行已编译产物时可用 JRE,需要编译、打包、诊断工具时要用 JDK;多版本环境先看 JAVA_HOME、PATH 与实际命令输出是否一致。 判断原则是先确认原文对象、输入条件和适用边界是否成立;前提成立时按该机制处理,前提不成立时说明例外、风险和替代方案。
记忆锚点
记住:JDK 管开发,JRE 管运行,JVM 管执行。,先抓问题,再验机制,最后查边界。
衍生拓展
- 复习
JDK、JRE、JVM的包含图;- 易混点:java命令不等于完整JDK;- 面试延伸:解释构建镜像与运行镜像分层;- 实践扩展:检查JAVA_HOME与PATH。
落地场景
新项目排查环境时,先确认开发工具和运行虚拟机来自同一套安装目录:
1javac -version
2java -version
3which java若 javac 不存在,说明当前环境更像运行时镜像,不适合本地编译。