mac卸载旧jdk需五步:一、用/usr/libexec/java_home -v确认注册状态并比对物理目录;二、终止ide及java进程后再删/library/java/javavirtualmachines下对应.jdk;三、清除/library/internet plug-ins/javaappletplugin.plugin等插件与面板;四、清理用户级缓存及偏好文件;五、修正shell配置后执行sudo killall -u $(whoami) cfprefsd刷新缓存,重启终端验证。

Mac 上卸载旧 JDK 不能只删 /Library/Java/JavaVirtualMachines 目录就完事——残留的插件、用户级配置和缓存会让 java -version 仍显示旧版本,或导致 /usr/libexec/java_home -V 列出已删除的 JDK。
怎么确认当前装了哪些 JDK
别猜,直接查真实注册状态:
- 运行
/usr/libexec/java_home -V——它读的是 macOS 的 Java 注册表,比ls /Library/Java/JavaVirtualMachines更权威;输出里带路径的每一行,都是系统“认”的 JDK - 再执行
ls /Library/Java/JavaVirtualMachines——对比两者结果:如果java_home -V里有某条目,但目录不存在,说明注册表残留;反之,目录存在但没列出来,说明没被正确注册 -
echo $JAVA_HOME和which java一起看,确认当前生效的是哪个版本及其来源
删 JDK 目录前先关掉 IDE 和终端后台进程
macOS 会锁住正在被 Java 进程使用的 .jdk 目录,sudo rm -rf 可能静默失败(尤其 IntelliJ、Eclipse、Gradle daemon 在后台跑时):
- 退出所有 IDE(IntelliJ、VS Code 的 Java 扩展、Eclipse)
- 终端里执行
ps aux | grep java,杀掉残留的java或gradle进程:kill -9 $(pgrep -f "java|gradle") - 再删目录:
sudo rm -rf /Library/Java/JavaVirtualMachines/jdk1.8.0_361.jdk(把示例名换成你实际要删的)
必须同步清理的三类非 JDK 目录
Oracle JDK 安装器会往多个位置写文件,漏一项就可能让 java_home 缓存失效或触发错误弹窗:
- 浏览器插件:
sudo rm -rf "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin"(JDK 8 及更早必删) - 系统偏好设置面板:
sudo rm -rf "/Library/PreferencePanes/JavaControlPanel.prefpane" - 用户级缓存:
rm -f ~/Library/Preferences/com.oracle.java.JavaPreferences.plist;rm -rf ~/Library/Caches/com.oracle.java.JavaAppletPlugin;rm -rf ~/Library/Application\ Support/Oracle/Java
环境变量重配后要刷新 java_home 缓存
macOS 的 java_home 命令自带缓存机制,改完 .zshrc 或 .bash_profile 后不刷新,java_home -V 仍返回旧列表:
- 改完配置文件后,先
source ~/.zshrc(或source ~/.bash_profile)让$JAVA_HOME生效 - 再强制清空缓存:
sudo killall -u $(whoami) cfprefsd(这是 macOS 的偏好设置守护进程,杀掉后系统自动重启并重建 Java 注册缓存) - 新开一个终端窗口验证:
java -version、java_home -V、echo $JAVA_HOME三者输出必须一致且指向新 JDK 路径
最容易被忽略的是 cfprefsd 进程刷新这步——很多人重配环境变量后反复 source 却发现 java_home -V 不更新,就是卡在这儿。不是配置没生效,是系统缓存没清。











