适用读者:项目一大就卡、索引一跑几分钟、风扇狂转的人。
前置:S01-B06(插件成本)、S01-J04(调试性能意识)。
实测环境:JDK 21 / Ubuntu 24.04.1(堆上限对照为 2026-11-05 实测);IDEA 2025.x 配置口径。
覆盖旧文:A-1371(IDEA 设置内存大小,33 点)。
上一篇:S01-J04 · IDEA 调试与源码阅读:断点、求值、远程调试
下一篇:S01-J06 · 编码与字符集排障。
1. 一句话结论
"卡"不是一个问题,是四个不同的问题:启动慢、索引慢、内存不够(频繁 GC)、UI 卡(渲染/插件)。先分清哪一个,再动手。
旧文 A-1371 只讲了"调 -Xmx",覆盖的只是第三类。把四类混在一起调,常见结果是"内存给了 8G,还是卡"。
| 症状 | 大概率原因 | 对应章节 |
|---|---|---|
| 打开项目要等 3 分钟才可编辑 | 索引(+ 插件) | §4 |
| 用一会就卡、内存条爆满 | 堆不足 / 内存泄漏 | §2 |
| 敲字延迟、补全要等 | Inspection / 插件 / 大文件 | §5、§6 |
| 启动本身很慢 | 插件加载 | S01-B06 §6 |
2. 堆内存:-Xmx 到底决定了什么(实测)
2.1 参数含义
| 参数 | 含义 | 说明 |
|---|---|---|
-Xms |
初始堆大小 | 和 -Xmx 设成一样可避免运行期扩容抖动 |
-Xmx |
最大堆大小 | 超过就 OutOfMemoryError |
-XX:ReservedCodeCacheSize |
JIT 代码缓存 | IDEA 默认值偏小,大工程可调 |
-XX:+UseG1GC |
GC 算法 | 新版默认即 G1 |
2.2 实测:堆上限如何决定"能不能装下"
同一段分配 100 MB 的代码,只改 -Xmx:
$ java -Xmx64m Heap 100
maxHeap=64MB, 尝试分配=100MB
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at Heap.main(Heap.java:12)
$ java -Xmx256m Heap 100
maxHeap=256MB, 尝试分配=100MB
成功分配 100MB
这条实验解释了两件事:
-Xmx不是"建议值",是硬上限——超了就是 OOM,没有缓冲。- 调大它能解决"装不下",但解决不了"泄漏"。如果内存曲线是"越用越高、GC 后也降不下来",加堆只是推迟崩溃。
2.3 该给 IDEA 多少
| 物理内存 | 建议 -Xmx |
说明 |
|---|---|---|
| 8 GB | 2 GB | 再大就会和系统/浏览器抢内存 |
| 16 GB | 4 GB | 常规后端工程的舒适区 |
| 32 GB+ | 6–8 GB | 单体大工程 + 多模块 + Docker 同时跑 |
判据:-Xmx 不超过物理内存的 50%。留一半给操作系统、Docker、浏览器——IDE 不是唯一吃内存的进程。
旧文说"默认 1024M,推荐最小 2G",方向对;本篇补上"上限怎么定"和"调大不解决泄漏"。
2.4 两条配置路径(旧文的两招)
| 方式 | 路径 | 适用 |
|---|---|---|
| 图形化 | Help → Change Memory Settings |
只改堆大小,最省事 |
| 文件 | Help → Edit Custom VM Options |
需要加其他 JVM 参数(GC、code cache、-D 属性) |
自定义文件的位置:Help → Edit Custom VM Options 会打开/创建用户级 idea.vmoptions(在 S01-B09 §2 的 config 目录下)。不要去改安装目录里的 bin/*.vmoptions——升级 IDE 会被覆盖。
3. 索引:IDE"变聪明"的代价
3.1 索引是什么
IDEA 扫描源码建立符号索引(类、方法、字段、引用关系)。有索引才能:秒级跳转、精准补全、Find Usages、重构。索引是"用启动/首次打开的时间,换日常操作的秒级响应"。
| 阶段 | 触发时机 | 典型耗时(中型工程) |
|---|---|---|
| 全量索引 | 首次打开 / 清缓存后 / 大版本升级 | 1–10 分钟 |
| 增量索引 | 少量文件变动 | 秒级 |
| 依赖索引 | pom.xml 变动后 Reload |
十几秒到分钟级 |
3.2 让索引变快:排除不该索引的目录
Settings → Project Structure → Modules → 选中目录 → Mark as → Excluded
必须排除:target/、build/、node_modules/、dist/、日志目录、生成代码目录。
为什么重要:target/ 里有编译产物与大量 class,索引它们纯属浪费;node_modules/ 动辄几万文件——前端目录不排除,索引时间能翻倍。
3.3 什么时候值得重建索引
| 场景 | 是否重建 |
|---|---|
| 升级 IDE 大版本 | ✅ |
项目全红但 mvn compile 通过(且 Reload Maven 无效) |
✅ |
| 日常觉得"有点慢" | ❌(重建完还是慢,问题在别处) |
改了 pom.xml |
❌(Reload Maven 即可) |
重建的代价是几分钟不可用,别当下意识动作(S01-B09 §4 有 Invalidate Caches 的边界说明)。
4. UI 卡顿:Inspection 与插件
| 来源 | 表现 | 处置 |
|---|---|---|
| Inspections(静态检查) | 输入时卡顿、大文件滚动卡 | Settings → Editor → Inspections,关掉不用的规则;或在 Settings → Editor → General → Typing 关 跑 inspections on the fly |
| 插件 | 特定操作卡(如保存时格式化、AI 补全) | B06 的二分排查 |
| 大文件(> 2 MB 的 log/json) | 打开就卡 | 用 Settings → Editor → File Types 把大文件交给轻量查看;或直接终端 less |
| 字体连字/主题 | 滚动掉帧 | 关闭连字、简化主题 |
Power Save Mode(File → Power Save Mode):关掉所有 inspections 与后台分析。演示/录屏/电池场景的应急开关,但会失去实时检查。
5. 大工程的六条实践
| # | 实践 | 收益 |
|---|---|---|
| 1 | 排除 target/node_modules/生成代码 |
索引时间大幅下降 |
| 2 | 只打开需要的模块(File → Open 单模块,而不是整个多模块工程) |
内存与索引都降 |
| 3 | 用 Compile on demand 而非自动全量编译 |
避免无意义的全量重编译 |
| 4 | 关闭不用的插件(B06 三维打分) | 启动与常驻内存下降 |
| 5 | 把 -Xmx 提到物理内存 50% |
减少 Full GC |
| 6 | 需要更多算力时考虑远程开发(Remote Development) | 本地只渲染,重活给远端 |
远程开发的取舍(JetBrains Gateway / SSH 远程):
| 优点 | 代价 |
|---|---|
| 代码不落地本地(安全合规) | 依赖网络质量;断线体验差 |
| 算力用服务器(大工程索引快) | 需要服务端装 IDE 后端;调试端口要规划 |
6. 测量方法:把"卡"变成数字
① 启动到可编辑:清空 idea.log → 重启 → 打开同一工程 → 量时间
grep -nE "Starting IntelliJ IDEA|Project opened|Indexing" idea.log | head
② 索引耗时:日志里 "Indexing" 相关行的时间跨度
③ 内存:Help → Diagnostic Tools → Show Memory Indicator(状态栏堆占用)
④ UI 卡顿:插件全关 vs 全开,同一操作各做 3 次,记录主观延迟
⑤ 对照:Settings → Plugins → Disable All Downloaded Plugins 后重复 ①③
方法而非实测:这五项我未在本机出数(无 IDE 基准环境)。测量口径比具体数字更重要——数字会随工程与机器变化。
7. 旧文对照
| 项 | 旧文 A-1371 | 本篇处理 |
|---|---|---|
Help → Change Memory Settings |
✅ 给了 | 保留,补"默认 1024M、建议 2G"之外的上限判据(物理内存 50%) |
Help → Edit Custom VM Options |
✅ 给了 | 保留,补"别改安装目录"与 -Xms/-Xmx/CodeCache 说明 |
-Xms/-Xmx 含义 |
✅ 有解释 | 保留;新增 §2.2 实测(64m OOM vs 256m 成功)与"调大不治泄漏" |
| 索引 | ❌ 未涉及 | 新增 §3(含 Excluded 目录的必要性) |
| Inspection/插件/大文件 | ❌ 未涉及 | 新增 §4 |
| 大工程实践、远程开发 | ❌ 未涉及 | 新增 §5 |
| 测量方法 | ❌ 未涉及 | 新增 §6 |
8. 自测
-Xmx调大后仍然卡,最可能的两个原因是什么?- 为什么要把
target/与node_modules/标记为 Excluded? -Xms与-Xmx设成相同值,好处是什么?- 什么时候才值得
Invalidate Caches?什么时候纯属浪费时间? - 远程开发解决了什么、又引入了什么新问题?
9. 下一篇
S01-J06 · 编码与字符集排障:一次讲清乱码的四种成因
性能之外,另一个"看起来像玄学"的问题就是乱码。下一篇把乱码拆成四层(源文件编码、编译编码、运行时默认编码、终端显示编码),每一层给出独立的验证命令,并用实测说明"改哪一层不影响别人"。
本篇属于系列《S01 · 开发环境与工具链》。旧文来源:A-1371;JDK 堆上限对照为 2026-11-05 实测。