应优先执行File → Invalidate Caches and Restart… → Just Restart,它重置符号索引与语法树缓存但保留设置和插件;仅在升级GoLand或切换Go SDK时选Invalidate and Restart,避免gopls协议不匹配导致卡死。

GoLand 卡顿几乎从不源于 Go 代码本身,而是 JVM 堆内存不足、gopls 冲突、vendor 重复扫描或索引逻辑错乱——清理缓存只是表层动作,真正要动的是 goland.vmoptions、go.work 配置和目录标记。
怎么安全清理 GoLand 自身缓存(不是 Go 构建缓存)
IDE 缓存损坏会导致索引停滞、跳转失效、补全消失,但直接删整个缓存目录风险高;应优先用内置机制:
- 执行 File → Invalidate Caches and Restart… → Just Restart(不是 “Invalidate and Restart”),它会重置符号索引、语法树缓存,但保留设置和插件
- 若刚升级 GoLand 或切换了 Go SDK,必须选 Invalidate and Restart,否则
gopls与 IDE 的协议版本可能不匹配,引发光标卡死 - 别手动删
~/.cache/JetBrains/GoLand*/caches或%LOCALAPPDATA%\JetBrains\GoLand*\caches:部分缓存文件被进程锁住,删完反而触发重建风暴,CPU 暴涨两分钟 - 状态栏右键开启 Memory Indicator,如果重启后仍长期显示 “90%+”,说明问题不在缓存,而在内存配置
为什么 go clean -cache 对 GoLand 卡顿基本没用
go clean -cache 清的是 Go 编译器的 $GOCACHE(如 ~/Library/Caches/go-build),它只影响终端里 go build 的速度,和 GoLand 的编辑响应、跳转、补全完全无关。
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
- GoLand 调用
gopls做语义分析,gopls自己有独立缓存(存在~/.cache/gopls),go clean -cache不碰它 - 如果你关了 Settings → Go → Build Tags & Vendoring → Build project automatically,GoLand 甚至根本不会触发
go build,$GOCACHE压根不增长 - 真要清
gopls缓存:关掉 GoLand,删~/.cache/gopls(macOS/Linux)或%LOCALAPPDATA%\gopls(Windows),再重启
vendor 目录没排除是索引翻倍的元凶
默认情况下,GoLand 把 vendor/ 当作普通源码目录,每次保存一个 .go 文件,都会触发对整个 vendor/ 的增量 re-index——尤其当里面含 k8s.io/client-go 这类超大依赖时,单次索引可耗时 40 秒以上。
- 进 Settings → Directories,找到
vendor文件夹,右键 → Mark as Excluded(注意:不是点旁边 “Excluded” 标签,而是右键菜单操作) - 确认 Settings → Go → Vendor 中勾选了 Enable vendoring support,否则 IDE 会忽略
vendor.json或go.mod里的 vendor 声明 - 如果项目用了
go.work,确保vendor/不在任何use ./xxx路径下,否则 IDE 会把它当作 module 根再扫一遍
调内存不设 -XX:ReservedCodeCacheSize 就等于白调
只改 -Xmx4g 但漏掉 -XX:ReservedCodeCacheSize,JIT 编译器很快就会因 code cache 不足而退化为解释执行,索引速度掉一半,补全延迟从 200ms 涨到 1.5s。
- 编辑
goland64.vmoptions,必须同时加三行:-Xms2g、-Xmx4g、-XX:ReservedCodeCacheSize=512m - 物理内存 32GB 的机器,
-Xmx别超9216m;超过后 G1GC 停顿时间非线性增长,反而更卡 - 删掉所有
-XX:+UseG1GC—— GoLand 2023.3+ 默认用 ZGC,手动指定 G1 是自找麻烦 - 改完一定点 Save and Restart,别信“热加载”,JVM 参数必须重启才生效
最常被忽略的其实是 go.work 支持开关和 vendor 排除动作,这两项不做,调再大内存也压不住索引爆炸。性能优化不是堆参数数字游戏,而是让 IDE 用对的路径、加载对的模块、避开对的目录。


















