1. updating indices 到底是什么,为什么它总在折磨你
先说实话,updating indices 这个提示,几乎每个用 IntelliJ IDEA 的开发都见过。但你越急它越转,项目越大它越慢,甚至有时候你刚打开 IDE 想去改一行代码,它就是卡在那转圈圈,鼠标点哪儿都没反应。我最早接触 IDEA 是几年前从另一个 IDE 转过来的,第一感觉就是“这个 ide 怎么这么重”,后来才明白,它不是重,是它没搞清楚什么该索引、什么不该索引。
updating indices 翻译过来就是“更新索引”。IDEA 会对你打开的项目做一次扫描,把文件、类、方法、字段、引用关系全部建立成索引。你可以把它理解成给一本书做目录:文件越大、章节越多,做目录的时间自然就越长。IDEA 靠这一套索引,才能实现秒开的类跳转、全局搜索、自动补全和重构。所以索引本身不是坏东西,它是 IDEA 高效工作的基础。
但问题是,很多人把项目打开后,索引一直转不完,甚至十几分钟都在 updating indices,这就很难受了。导致这个问题的原因,多半不是 IDEA 本身不行,而是你没有告诉它哪些目录值得索引,哪些目录压根不用管。IDEA 很实诚,你给它一个项目,它默认会扫描整个项目结构,包括 node_modules、target、build、.idea 这些目录,这些目录动辄几万甚至几十万个文件,里面存的全是依赖、编译产物、临时文件,索引它们除了让 CPU 狂转、让进度条走不完之外,没有任何好处。
身份识别上也容易出问题。从老版本升级到新版本,索引格式可能完全不兼容,IDEA 会强制重来一遍。换了一个 Git 分支,代码结构变了,相关文件的索引也要更新。还有的人喜欢把项目放在机械硬盘上,或者放在公司网盘映射的本地目录里,文件监听文件变动都慢半拍,索引自然也跟着慢。
一句话总结:updating indices 慢,不是玄学,是索引对象太多、索引条件太差、索引缓存失效太频繁。下面我一个个说怎么治。
2. 对症下药:把 updating indices 彻底降速的方案
2.1 先把不需要索引的目录全部排除掉
这招的效果最立竿见影。你不用创建新项目,直接对现有项目做一次“瘦身”。
在 IDEA 里,最简单的办法是右键点击项目目录,选择 Mark Directory as,然后选 Excluded。如果是 Maven 项目,target 目录一般会自动标成 Excluded,但并不是所有构建工具和所有版本的 IDEA 都这么智能。我见过不少项目,打开后还是把 build、out、dist、node_modules 这些目录纳入索引的。
手动排除目录的操作路径是这样的:
- 打开 Project 工具窗口,找到项目根目录
- 在目录上右键,选择 Mark Directory as -> Excluded
- 如果有多个模块,每个模块下的 target、build、out、.gradle 等目录都建议检查一遍
排除了之后,IDEA 就不会再给这些目录建索引,搜索和跳转也都会自动忽略它们。要注意的是,Excluded 不是删除,只是让 IDEA 在工作区里无视它,构建工具依旧可以正常读写这些目录。所以你可以放心大胆地操作。
如果你想要更精准的控制,可以打开 Project Structure(快捷键 Ctrl+Alt+Shift+S),在 Modules 面板里,每个模块的 Sources 和 Excluded 标签页都可以精细调整。我一般习惯把项目的每个子模块都过一遍,保证没有漏网之鱼。
除了手动排除,IDEA 还提供了一个全局配置:Settings -> Editor -> File Types,在这里可以配置忽略文件和文件夹,比如可以添加.class、.jar、.git、node_modules 等。不过我个人觉得这个全局配置在部分老版本里效果不如 Excluded 直观,建议两个配合使用。
2.2 缓存清理的正确姿势:Invalidate Caches 与本地历史
有时候索引慢并不是因为项目大,而是因为缓存坏了。比如 IDEA 突然断电、强制退出,或者硬盘空间不够导致缓存写入失败,都有可能出现索引一直重复构建、进度条走到一半就卡死、或者明明没改代码却反复触发 updating indices 的怪现象。
这时最简单粗暴的办法,就是 File -> Invalidate Caches。弹窗里会提供几个选项:
- Invalidate and Restart:清空索引并重启,最彻底,优先用这个
- Clear file system cache and Local History:清理文件系统缓存和本地历史,但保留索引,一般用于缓存异常但不是索引问题的情况
- 如果你只是想释放磁盘空间,不愿意重建索引,可以去掉下方跟索引相关的勾选项
我推荐遇到索引问题先选 Invalidate and Restart。虽然重启后第一次打开项目会重新建索引,但是这次重建是干净的,没有垃圾数据干扰,速度反而比你在脏缓存上反复重试更快。清理完缓存之后,再结合排除目录,索引速度会有质的提升。
另外一个很多人不知道的点:IDEA 的 Local History 是个好东西,但日志积累多了也会拖慢性能。Local History 默认保留 5 天,文件改动频繁的项目会积累大量历史快照。如果你从来不用这个功能,可以在 Settings -> Appearance & Behavior -> System Settings -> File History 里把它关掉,或者调整保留天数。这个操作能减少不小的 I/O 压力。
2.3 针对超大项目的进阶方案:划分模块和拆分索引
如果你的项目实在太大,比如几十个模块的微服务工程、或者一个仓库里塞着前端和后端的所有代码,即使排除了 target 和 node_modules,索引量还是很大。这时就得从项目结构上想办法。
首先,检查一下项目里是否存在根本不需要的模块。很多工程是从老仓库迁移过来的,里面的老模块已经废弃了,但还在 pom.xml 或 settings.gradle 里挂着。这些模块会照常被 IDEA 加载和索引。正确的做法是,从构建配置里移除掉废弃模块,或者在 Project Structure 里把这些模块直接删掉。这样不但更新索引快,IDEA 整体的内存占用也会降下来。
其次,你可以把工程量大的仓库拆分成独立项目打开,而不是全部塞进同一个窗口。比如一个仓库里既包含用户端服务、管理端服务,又包含公共 SDK,如果它们之间没有强依赖,完全可以分别用 IDEA 打开,而不是强行放到一起。IDEA 虽然支持多模块项目,但跨多个独立仓库时,用多个窗口反而更流畅。
还有个偏门但有效的方法:直接用 IDE 的 Trusted Project 机制。新版 IDEA 在打开项目时会让你选 Trust Project 还是 Don't Trust,选择 Trust 之前,IDEA 会执行一次项目加载。如果你经常打开不信任来源的项目,建议在 Project Structure 里明确源文件目录,减少无意义的全局扫描。其实这本质上还是在帮 IDEA 缩小它需要关心的范围。
2.4 排除目录时需要注意的几个坑
排除目录听起来简单,但有几个地方容易踩坑。
第一个坑是,某些构建工具在重新导入项目后,会把之前排除的目录重新标记回普通目录。比如 Maven Reload Project、Gradle Sync 之后,Source 目录和 Excluded 目录会被构建工具重新读取并覆盖。所以这不是一劳永逸的,每次 Reload 完之后最好再检查一遍。
第二个坑是,如果你把某个包含源码的目录也排除了,IDEA 的代码搜索和跳转就会失效。我见过有人图省事,直接把整个 build 目录,甚至把某个模块的 src 给误排除了,导致整个模块的代码全部变成灰色,类跳转全部失败。排查了半天才发现是排除范围大了。
第三个坑是,node_modules 这种目录一定要优先排除。前端项目在 IDEA 里的加载速度,很大程度就取决于你有没有排除 node_modules。一个 node_modules 可能包含几万个包、几十万个文件,IDEA 要对每个文件建立索引的话,进度条转几个小时都不奇怪。
提示:排除目录之后,如果代码搜索找不到某些类,先检查是不是排除范围太大,而不是一上来就重建索引。
3. 缓存空间修改:别再让 C 盘被 IDEA 撑爆
3.1 IDEA 的目录到底是怎么组织的
IDEA 的缓存和配置不是放在项目目录里的,它有一个独立的系统目录。以 Windows 为例,默认情况下,IDEA 会把配置放到C:\Users\你的用户名\AppData\Roaming\JetBrains\IntelliJIdeaxxx,把缓存放到C:\Users\你的用户名\AppData\Local\JetBrains\IntelliJIdeaxxx。
注意这两个路径不一样。Roaming 路径下放的是配置、插件、日志,Local 路径下放的是缓存、索引、临时文件。其中 Local 路径里的index、caches、tmp这几个文件夹是最占空间的。我见过一个项目特别多、索引特别大的开发机,光 IDEA 的缓存目录就能占到 10 个 GB 以上。如果 C 盘本来就只有 128G 或者 256G 的固态,那就非常痛苦了。
所以定期查看这两个目录的大小很有必要。在 IDEA 里打开 Help -> Show Log in Explorer,可以快速定位到日志目录,日志目录就在系统目录下。你可以顺着路径找到整个 JetBrains 目录看看占用空间。
3.2 修改系统目录到其他盘符的详细步骤
IDEA 支持自定义系统目录路径,最简单的方式就是通过 Help -> Edit Custom Properties 来修改。
操作步骤:
- 打开 IDEA,进入 Help -> Edit Custom Properties
- 如果提示创建 properties 文件,选择 Yes
- 在打开的文件中,添加以下几行配置:
idea.system.path=D:/idea-data/system idea.config.path=D:/idea-data/config idea.log.path=D:/idea-data/log这里我建议把三个目录全都指向同一个新目录下的不同子目录,后续找文件也方便。路径根据自己的实际盘符和目录调整。
- 保存文件,重启 IDEA。
重启之后,新生成的配置、日志、缓存就全都会写到 D 盘了。但是要注意,旧目录里的缓存不会自动搬过去。你需要手动把C:\Users\你的用户名\AppData\Local\JetBrains\IntelliJIdeaxxx下的index、caches等文件夹复制到新路径下,或者干脆让它重新生成一遍。如果你不想要旧数据,直接删掉旧目录也行,IDEA 会自动创建新的。
这里还有一个细节:通过 Edit Custom Properties 修改的是配置文件,IDEA 在下次启动时才会读取。如果你等不及,可以直接修改 IDEA 安装目录下的idea.properties文件,但我不推荐这么干,因为版本升级时,安装目录下的文件可能被覆盖,而且权限控制更麻烦。用 Edit Custom Properties 生成的文件位于配置目录下,升级时不受影响。
修改好系统目录后,建议重启 IDEA 并打开一个项目,确认状态栏不再出现异常,再考虑清理旧目录,避免风险。
3.3 缓存目录迁移常见的坑和验证方法
缓存目录迁移完之后,有几个检查点:
第一,重启 IDEA 后去 Help -> Show Log in Explorer,确认路径已经变成你指定的新路径。如果还是老路径,说明配置没生效。
第二,项目打开速度、索引速度如果没有明显变化,先别急着怀疑迁移失败。缓存目录迁移的主要作用是把占用空间从 C 盘转移到其他盘,对性能的提升不一定有立竿见影的效果,但可以避免 C 盘满了导致的系统卡顿。
第三,不要在 IDEA 运行状态下直接删除旧缓存目录。如果你删除了正在使用的缓存,IDEA 可能因为文件消失而崩溃或者重新索引。先退出 IDEA,再清理。
第四,很多人在用双系统或者多人共享电脑时,用户名里有中文或者空格,这样某些老版本工具处理不了。如果你遇到奇怪的问题,可以试试把自定义路径设置为纯英文路径。
3.4 定期清理缓存脚本与手动方案
迁移完目录后,缓存还是会持续增长。为了不让自己某天突然收到“C 盘不足”的警告,我建议定期清理或者写一个小脚本。
IDEA 缓存目录里,最值得清理的是index和caches。这两个文件夹删除后,IDEA 会重新索引项目,虽然第一次有点慢,但能释放大量空间。操作时先退出 IDEA,然后手动删除这两个文件夹,再启动 IDEA 让它重新生成即可。
如果你习惯用脚本,可以写一个简单的清理脚本,比如把D:/idea-data/system/index和D:/idea-data/system/caches下的 30 天前的文件清理掉。不过脚本要注意别误删系统目录,同时做好日志记录。
注意:不要直接删除整个
system目录,最好只清理index和caches子目录,其他目录比如plugins、projects里存的东西删了可能引发别的问题。
4. 日常设置:让 IDEA 在性能体验上更顺手
4.1 内存调优:给 IDEA 分配多少内存才合适
IDEA 本身是 Java 写的,JVM 的堆内存设置直接决定了它的流畅程度。很多人默认不管,结果 IDEA 在项目大的时候频繁卡顿、甚至直接报 OutOfMemoryError。其实 IDEA 提供了图形化的内存调整入口。
打开 Help -> Change Memory Settings,可以直接修改 IDEA 的最大堆内存。默认情况下,IDEA 会根据系统总内存自动分配一个值,但有时候这个值对大型项目来说不够。
如果你打开一个几十个模块的 Maven 项目,又同时开几个微服务,IDEA 的堆内存占用很容易超过 2GB。我自己的建议是,在 16GB 内存的机器上,给 IDEA 分配 2GB 到 3GB;在 32GB 内存的机器上,可以给到 4GB。但注意不要无脑调大,因为堆内存越大,GC 暂停越明显,反而可能更卡。
除了 Change Memory Settings 之外,还可以通过修改 JVM 参数文件进一步调优。找到 IDEA 安装目录下的idea64.exe.vmoptions(Windows)或者idea.vmoptions(macOS、Linux),修改以下几个参数:
-Xms2048m -Xmx4096m -XX:ReservedCodeCacheSize=1024m-Xms是初始堆大小,-Xmx是最大堆大小,ReservedCodeCacheSize是 JIT 编译后代码缓存的保留空间。这几个参数设置好之后,重启 IDEA 生效。
为什么要关心 GC?因为 IDEA 在更新索引、编译、代码检查时会产生大量短命对象,如果堆太小,频繁的 Minor GC 会让你感觉 IDEA 一卡一卡的。如果你对 JVM 调优不熟,只需记得一句话:给 IDEA 的初始堆和最大堆设成相同值,可以减少堆扩缩容带来的卡顿。
4.2 关闭不用的插件:插件是性能的隐形杀手
插件装多了,IDEA 启动会变慢,后台分析和索引也会变慢,尤其是那些会在后台定时扫描代码的插件,比如代码规范检查、定时任务的插件,每来一轮工作,CPU 占用就飙升。
新版 IDEA 启动经常出现企业级激活码、云开发等插件,如果不用,完全可以禁用。在 Settings -> Plugins 页面里,找到 Installed 标签,把不用的插件点 Disable,甚至 Uninstall。
我常推荐禁用或慎重安装的几类插件:
- 云开发插件(如果不用云服务,完全没必要装)
- 数据库插件(如果项目不涉及 DB,或者你习惯用独立的数据库客户端,可以直接禁用)
- 重量级框架插件(如果项目不用 Vaadin、JavaFX 等框架,装了纯属浪费内存)
- 主题类和工具类插件(大多数对性能没有任何帮助)
保留一些核心插件是必要的,因为 IDEA 很多功能都依赖插件实现。但你要有意识地管理插件数量。我见过一台开发机上装了 80 多个插件,启动时间拉长到 5 分钟,后台随时烫手。禁用掉不必要的插件之后,启动时间几乎减半。
4.3 关闭自动更新和文件监听,减少后台突发负载
IDEA 默认会自动检查更新,每次启动可能都会连接官网。这个功能看似无害,但在一些网络条件不好的场景下,会造成 IDEA 启动时变得很慢,因为它在后台做网络请求。如果你的 IDE 版本稳定,建议直接关掉。
在 Settings -> Appearance & Behavior -> System Settings -> Updates 里,把 Automatically check updates 关掉即可。这样 IDEA 启动时就不用做网络请求,响应会更快。
文件监听也是一个隐藏的性能消耗点。IDEA 会监听项目文件的变化,一旦文件系统有大量文件变动(比如 Git 切换分支、Maven 重新下载依赖、 build 工具生成大量临时文件),IDEA 就会触发重新扫描和索引。这些监听是有代价的。在 Settings -> Appearance & Behavior -> System Settings 里,可以调整“Synchronize files on frame activation”等选项。如果你经常切分支,可以在 Git 操作完后稍等一下,别急着切来切去,让 IDEA 有时间完成后台任务。
4.4 编码、自动导入、外观等其他实用设置
日常开发里,还有一些细节能显著提升使用体验。
编码格式统一很重要。在 Settings -> Editor -> File Encodings 里,把 Global Encoding 和 Project Encoding 都设置为 UTF-8。否则项目里有繁体中文、日文、韩文文件时,IDEA 有概率乱码,严重的甚至影响索引和搜索。
自动导入建议开启。在 Settings -> Editor -> General -> Auto Import 中,勾选 Add unambiguous imports on the fly 和 Optimize imports on the fly。这样写代码时就会自动补 import,而且会顺手清理多余的 import,保持代码整洁。
字体和编辑区行为也可以调一下。在 Settings -> Editor -> Font 中设置你习惯的字体大小,同时在 Settings -> Editor -> General -> Mouse Control 里勾选 Change font size with Ctrl+Mouse Wheel,以后就可以用 Ctrl+滚轮调节字号,演示和截图时也方便。
对于新版 IDEA,如果你不喜欢全新的 UI,可以在 Settings -> Appearance & Behavior -> Appearance 里切换回旧版 UI。新版 UI 确实更现代,但在小屏幕上并不一定更好用,选自己顺手的就好。
5. 出问题怎么排查:几个常见场景和解决记录
5.1 索引速度依然慢怎么办
如果你把排除目录、清理缓存、调大内存都做了,索引速度还是慢,那问题可能出在更底层。
第一,项目是否放在机械硬盘或者网络磁盘上。IDEA 对文件系统随机读性能非常敏感,机械硬盘上索引一个中等大小的项目,速度可能比固态硬盘慢四五倍。建议把项目放到本地固态硬盘,尽量别放在公司映射的网盘上。
第二,杀毒软件或系统安全工具是否在后台扫描项目文件。Windows 的 Defender 有时候会在文件变动时逐个扫描文件,这会和 IDEA 抢磁盘 I/O。你可以在杀毒软件里把 IDEA 安装目录和项目目录加为信任区。这项工作要专业谨慎,千万别因为设置错误导致系统安全出现漏洞,建议按官方文档操作。
第三,日志里是否有大量报错。打开 Help -> Show Log in IDEA,查看idea.log,如果有大量的大堆栈异常,那可能是某个插件崩溃导致索引反复失败。
5.2 迁移缓存目录后打不开项目
有时候改了系统目录之后,IDEA 重开反而报错,或者之前的项目列表消失。这是比较常见的问题,原因多半是 config 路径里没有把原来的 keymaps 和模板配置迁移过去。
解决方法也很简单:把旧系统目录下的config/options、config/templates等关键文件夹复制到新路径,或者直接把旧 config 里的内容整体复制过去。如果你嫌麻烦,最稳妥的办法是迁移前先使用 File -> Manage IDE Settings -> Export Settings 导出一份配置,迁移后再用 Import Settings 导入。
5.3 到底要不要用 Invalidate Caches,多久能重建完
Invalidate Caches 不是万能药,它只治“索引数据损坏”这种病,如果你的索引慢是因为项目太大、目录没排除到位、内存不够,那清缓存只会让你把痛苦的第一次建立索引过程再经历一遍。
所以我的建议是:先做排除目录和调内存,最后再清缓存。不要一上来就 Invalidate Caches,有时候你会发现自己白等了几分钟。
常见的索引问题排查顺序可以参考这个表:
| 现象 | 优先排查方向 | 建议手段 |
|---|---|---|
| 索引进度条一直卡住 | 是否有超大目录未排除 | 检查 target、node_modules、build |
| 每次打开项目都会索引 | 缓存损坏或路径异常 | 先迁移目录,再 Invalidate Caches |
| 索引速度时快时慢 | 后台插件或系统 I/O 占用 | 关闭无用插件,检查杀毒软件 |
| 索引过程内存飙升 | JVM 堆太小或插件过多 | 调大 -Xmx,禁用非必要插件 |
| 索引正常但代码跳转失败 | 排查排除范围是否过广 | 打开 Project Structure 检查标记 |
5.4 两个容易被忽略的日常习惯
我想额外提醒两件事。
第一,不要同时在一个 IDEA 窗口里打开特别多项目。IDEA 虽然支持多项目在同一窗口打开,但多个项目共享同一份内存和索引,会互相拖慢。我见过有人一个窗口同时开着五六套系统,索引跑起来 CPU 直接打满。
第二,定期重启 IDEA。这个建议听起来很土,但很管用。IDEA 长时间运行后,JVM 里的对象碎片、文件句柄、插件缓存都会累积,表现出来就是越用越卡。每天上班打开 IDEA,中午吃饭或者下班前顺手重启一次,很多疑难杂症就直接消失了。
6. 我踩过的坑和一点个人心得
最后分享几个我自己的真实经验。
有一年我在做一套微服务重构,项目仓库里塞着 40 多个模块,还混着两个前端项目。IDEA 打开一次要转好几分钟索引,每次切换 Git 分支都要等半天。我原本以为是无解的,后来花了半小时把 module 梳理了一遍,排除了所有不需要建索引的目录,又把缓存目录迁走,索引时间从五分钟降到了四十秒,整个人的心情都变好了。
还有一次,IDEA 突然卡在 updating indices 上不动,清理缓存也没用。最后发现是我前一天把项目放到桌面上的一个同步网盘目录里了,网盘客户端一直在后台同步文件,导致文件系统频繁变动,IDEA 的索引被反复无效化。把项目移出同步目录之后,问题秒解。所以如果你的项目放在各种网盘同步目录里,请务必迁出来。
IDEA 不是越新越好,也不是功能越多越好。它只是一个工具,你的目标是让它在你自己的机器、自己的项目上跑得最顺。多花一点时间配置好排除目录、缓存位置和内存参数,后面每天写代码的体验都会舒服很多。
如果你照着上面的方法调完,updating indices 还是慢,那就在项目打开的时候先干点别的,比如看需求文档,等它慢慢索引。要真急,就用 2.2 的 Invalidate Caches,再结合 2.1 的排除目录重新来一遍。