JDK是Java开发工具包,SDK是更广义的软件开发工具包,JVM是Java程序运行的虚拟机环境,三者最直接的关系是:JDK包含了JVM,而JDK本身又是SDK大类下的一个具体实现。
很多初学者刚接触Java时,总被这三个英文缩写搞得一头雾水,打开Oracle官网,看到Java SE Development Kit,又看到Java Virtual Machine,转个身又听说Android SDK、iOS SDK,到底谁包含谁?谁的活归谁干?这篇文章用最直白的大白话,把这三兄弟的分工、关系、以及日常使用中最容易踩的坑一次说清。
JDK和SDK的区别是什么
先说结论:SDK是全家桶,JDK是其中一个专门做Java饭的厨子,SDK是Software Development Kit,翻译过来是软件开发工具包,它是一整套工具的集合,只要是为了某平台开发软件而配套的工具都能叫SDK,Android有Android SDK,微信小程序有微信开发者工具SDK,甚至连一个智能硬件的厂商都会发布自己的SDK。
JDK是Java Development Kit,专门服务于Java语言,它有固定的三件套:编译器(javac)、运行时环境(JRE)、以及一堆类库和调试工具,这里要强调一点,JDK是SDK思想在Java领域的具体落地,但 JDK不等于SDK,这一点在面试和日常沟通里被混淆的频率相当高。
做个类比更清楚:SDK就像一间设备齐全的厨房,里面有锅碗瓢盆、烤箱、冰箱,你不管是做中餐还是西餐都能从中拿工具,JDK就是专门为做中餐定制的一套刀具和灶具,做中餐绝对顺手,但拿去做法餐就差点意思,如果你问“JDK和SDK哪个好”,这个问题本身就不成立,因为一个是子集,一个是父集。
JVM虚拟机在JDK中扮演什么角色
JVM(Java Virtual Machine)是Java程序能跨平台运行的核心秘密,它本身是个程序,负责把编译后的字节码翻译成当前操作系统能懂的机器码。 没有JVM,Java写出来的程序就是一堆半成品,没法直接跑。
JVM的工作流程可以拆成三步,第一步,你用JDK里的javac命令把.java源码编译成.class字节码文件,第二步,JVM通过类加载器把这些.class文件加载进来,但这一步不执行,只是把字节码放进内存,第三步,执行引擎逐条翻译字节码为机器指令,让你写的代码真正在操作系统上运行,这就是“一次编写,到处运行”的由来,Windows的JVM翻译成Windows指令,Linux的JVM翻译成Linux指令,你的代码不用改一个字。
在JDK安装目录下,你能找到一个叫java.exe的可执行文件(Windows系统),它就是JVM的启动器,你平时在命令行敲java HelloWorld,实际上干活的不是java.exe本身,而是它启动并托管进入了一个JVM进程。
JVM在JDK内部的位置,可以理解为发动机之于汽车,你买回一辆车,不会说买了发动机,但发动机是整车最核心的部分,JDK这个工具箱里,JVM就是那个让Java程序跑起来的发动机,另外要特别说明,JVM不只是命令行工具,它内部还有内存管理、垃圾回收、即时编译(JIT)一整套机制,这些是Java性能调优的主要阵地,如果你以后用VisualVM或JConsole连接一个运行中的Java进程,看的就是JVM的运行数据。
JVM和JDK、JRE各自管什么
这里顺带把JRE也拉进来说清楚,因为三者的关系是层层嵌套的。
- JRE(Java Runtime Environment):Java运行环境,只包含JVM和核心类库,不包含编译器。
- JDK:完整开发包,包含JRE中所有东西,外加编译器、调试器、文档生成器等开发工具。
- JVM:JRE内部负责执行字节码的引擎,整个体系的基石。
在JDK 8及以前,你安装JDK后,目录里会有一个jre子文件夹,但JDK 9以后,Oracle改变了安装结构,不再单独提供JRE目录,所有模块都被整合进了JDK的jmods文件夹里,如果你只是想运行一个Java程序而不是开发,可以只安装JRE(旧版本),或者使用更精简的jlink命令自定义运行时镜像。
开发安卓用哪个工具包
现在有个常见场景经常把人绕晕,就是做Android开发时,到底用的是JDK还是Android SDK?答案是两个都要。
Android应用的主体代码用Java或Kotlin写,编译过程依赖JDK提供的javac,但Android有自己的一套API和UI框架,这些由Android SDK提供,开发安卓App的实操路径是:先下载安装JDK并配置JAVA_HOME环境变量,再下载Android Studio,它会自动帮你安装对应的Android SDK组件。Android SDK里提供了adb(调试桥)、Android模拟器、platform-tools等工具,但没有编译器,编译器还是从JDK里调用的。
如果你直接在Android Studio里新建一个项目,打开Project Structure可以同时看到JDK位置和Android SDK位置,两者协同工作,缺一不可,这就好比你要盖一栋楼,JDK提供水泥和砖头,Android SDK提供设计图纸和吊车,谁替代不了谁。
还有一个特例是Android开发者常听的Gradle,它是构建工具,负责把Java代码和Android资源打包成APK,Gradle本身需要跑在JVM上,所以你的电脑必须装有JDK,Gradle才能启动,这也从侧面印证了,JVM是整个Java生态的地基,SDK负责的是上层建筑。
JDK下载选哪个版本
关于JDK版本选择,2026年的现状是JDK 17和JDK 21是绝对的主流,JDK 23也已发布但生产环境使用率较低,行业共识认为,长期支持版本(LTS)是企业首选,因为Oracle对LTS版本提供长达数年的免费安全更新。
挑选JDK发行版时,你面对的不是一个选项,Oracle官方JDK是原汁原味的,但许可证和商业使用收费政策比较严格,个人开发免费,企业商用可能涉及付费,如果追求完全开源免费,OpenJDK是社区维护的参考实现,Android Studio和绝大多数开源框架都默认兼容它,此外还有Amazon Corretto、Microsoft Build of OpenJDK、Adoptium Eclipse Temurin这些发行版,都是基于OpenJDK重新构建的,性能差异微乎其微,关键看你对哪家厂商的维护更新更有信心。
配置JDK的步骤可以记住,Windows和macOS通用,去对应厂商官网下载安装包,注意选择与操作系统位数匹配的版本,配置环境变量,Windows用户需要新建JAVA_HOME指向JDK安装根目录,然后编辑Path变量追加%JAVA_HOME%\bin,macOS和Linux用户一般通过/etc/profile或.zshrc文件配置,在命令行敲java -version验证,成功输出版本号即代表配置完成。
安装完JDK后还能装多个JVM吗
这是开发环境里比较常见的真实疑问,答案是可以,且互不干扰,你完全可以在同一台电脑上装JDK 11和JDK 21,切换时只需修改JAVA_HOME和Path环境变量指向不同目录,IDE例如IDEA或Eclipse,每个项目都能单独指定使用哪个JDK版本,如果你的框架要求JDK 11,而另一个老项目必须用JDK 8,两者并行一点问题没有。
不过路径管理上容易出乱子,这里有个实操建议:安装JDK时,把多个版本装在不同盘符或统一命名文件夹,比如D:\devtools\jdk8、D:\devtools\jdk17,避免版本覆盖,再配合IDE的Project Structure,每个项目选各自的SDK,基本不用担心版本冲突,毕竟你装多个JVM,本质是因为JVM是在JDK目录下的,切换JDK就等于切换JVM版本。
虚拟机在Python和其他语言里也存在吗
这个问题很多人心里犯嘀咕,因为Python、Ruby、JavaScript(Node.js)也有类似“运行时环境”的东西。JVM只是虚拟机的一种实现,虚拟机不是Java的专利,Python解释器其实也内置了一个执行字节码的虚拟机,但通常不叫JVM,叫PVM(Python Virtual Machine)。.NET平台的运行时叫CLR(Common Language Runtime),也是一种虚拟机。
它们之间的区别在于侧重点不同,JVM是Java世界定制的,支持Java、Kotlin、Scala、Groovy等JVM系语言;CLR是C#、F#、VB.NET的家;PVM主要服务Python自己,如果你做的是Java系统开发,只需要关心JVM就足够,不用把概念扩展太多,但如果做的是多语言混合架构,比如前端用Node.js,后端用Java,中间有Python脚本做数据处理,那么理解一台机器上同时跑着三种不同的虚拟机是有价值的,它们各自隔离,互不干涉。
JDK安装目录内部各有什么玄机
很多开发者用了几年JDK,从没打开过安装目录细看,打开JDK 17的bin文件夹,你能看到很多小工具。
- javac.exe:Java编译器,将源码转为字节码。
- java.exe:启动JVM并运行Java程序。
- jar.exe:打包工具,把多个class文件封装为jar包。
- javadoc.exe:自动生成API文档。
- jconsole.exe和jvisualvm.exe:图形化的监控和故障排查工具。
- jcmd.exe和jstack.exe:命令行诊断工具,常用于生产环境排查死锁。
顺便说一句,JVM的调优并非玄学,核心参数如-Xmx控制最大堆内存,-XX:+PrintGCDetails输出垃圾回收日志,都可以在启动时手动指定,生产环境里你不合理配置堆内存大小导致的OOM(内存溢出),其实就是在对JVM不熟悉的情况下最容易踩的坑,据工信部数据显示,近年来国内Java技术栈在业务系统中的占比依然居高不下,这也意味着JVM调优能力的市场价值在相当长一段时间内不会打折。
关于JDK、SDK、JVM还有哪些常见问题
只安装JDK能不能运行Java的jar包?
能,JDK内部自带了JRE和JVM,运行已有jar包的过程不需要额外安装其他东西,但反过来,如果你只安装了JRE(老版本),只能运行已编译好的class或jar文件,无法编译源码,也不能使用javadoc等开发工具。
升级JDK版本后旧项目会不会出问题?
存在升级后因API移除或行为变更导致报错的概率,Java团队对兼容性非常谨慎,一般小版本更新(比如17.0.2到17.0.10)完全无感,但跨版本升级(比如8直接到21),部分内部API如sun.misc相关用法会彻底移除,需要先跑通全部测试用例再部署上线。
JVM的垃圾回收是自动的吗?
自动触发,但触发时机和回收策略需要你通过参数选择和配置,JVM默认的G1回收器会自动管理堆内存,当对象生命周期结束且内存空间不足时执行回收,如果业务延时敏感,可以考虑选择ZGC收集器并设置目标停顿时间,这些都不是开箱即用但效果立竿见影的选项,需要结合压测数据和业务场景反复调整。
至此可以收束全篇,JDK是开发者的工具箱,SDK是工具箱的放大版,JVM则藏在整个体系的底层默默干活,理解它们的区别,就掌握了Java开发环境的第一把钥匙,后续托管代码、调优内存、排查故障,全都建立在这层理解之上。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/925203.html


评论列表(1条)
这篇文章写得非常好,内容丰富,观点清晰,让我受益匪浅。特别是关于打开的部分,分析得很到位,给了我很多新的启发和思考。感谢作者的精心创作和分享,期待看到更多这样高质量的内容!