IntelliJ IDEA 从卡顿到起飞,只用改这些。。。

21 阅读17分钟

前言

今天不聊高并发、不聊架构设计,想和大家聊一个每位Java程序员每天都在用的工具——IntelliJ IDEA。

说实话,用了多年IDEA,我踩过不少坑。

今天我把最经典的10个坑整理出来,希望能帮大家少走一些弯路。

很多小伙伴在工作中肯定也遇到过类似的问题,比如“IDEA突然变卡了”、“代码明明没错就是编译不过”、“Debug的时候断点不生效”等等。

这篇文章没有高深的理论,全是实战经验,小白也能看懂。

希望对你会有所帮助。

更多项目实战在我的技术网站:susan.net.cn/project

IDEA的优缺点和使用场景

在正式开讲之前,我们先来客观地看一下IDEA这款IDE到底好在哪、不好在哪,以及适合什么场景。

IDEA的优点

  1. 智能代码提示:相比Eclipse,IDEA的代码分析引擎更强大,能根据上下文给出更精准的补全建议。
  2. 重构能力极强:重命名、提取方法、改变签名等重构操作非常安全,能自动修复所有引用。
  3. 内置工具丰富:版本控制、数据库客户端、HTTP Client、终端等一应俱全,不用来回切换。
  4. 插件生态完善:Lombok、MyBatis、SonarLint等插件几乎覆盖了所有开发场景。
  5. 调试功能强大:条件断点、表达式求值、远程调试、内存分析等,排查问题非常高效。

IDEA的缺点

  1. 内存占用较高:默认配置下轻松吃掉2-4G内存,老机器跑起来比较吃力。
  2. 索引机制耗时:每次导入项目或依赖变更,都会触发重新索引,大项目可能要等几分钟。
  3. 配置相对复杂:很多优化需要手动调整,新手容易被各种设置搞晕。
  4. 商业软件:Ultimate版本收费,虽然可以用Community版,但很多企业级功能(如Spring、JPA、JS等)需要付费。

适用场景

场景是否推荐说明
大型Java/Spring项目⭐⭐⭐⭐⭐IDEA的Spring支持无出其右
中小型Web项目⭐⭐⭐⭐⭐开发效率远高于Eclipse
多语言混合项目(Java+JS+Python)⭐⭐⭐⭐⭐Ultimate版支持所有主流语言
老旧机器(内存<8G)⭐⭐勉强能用,但建议升级配置或换VS Code
纯前端项目⭐⭐VS Code可能更合适
学生/开源学习⭐⭐⭐⭐Community版足够用

好了,了解这些背景之后,咱们正式进入主题——我踩过的10个坑。

第1个坑:越用越卡,CPU狂飙

现象

IDEA打开两三个小时之后,敲个代码都要卡两秒,鼠标转圈圈,CPU动不动就100%。

重启一下又好一会儿,过一会儿又卡了。

原因分析

IDEA的卡顿通常有两个原因:内存分配不足索引被频繁触发

先说说内存。

IDEA默认的堆内存只有512MB-1GB左右,对于现代项目(尤其是微服务项目,一个workspace里有十几个module)来说,这点内存根本不够用。

JVM频繁进行Full GC,自然就卡了。

再说说索引。

IDEA会对项目中的所有文件建立索引,以便实现快速搜索、跳转等功能。

但是如果你开启了“自动索引外部文件”或者项目中有一个巨大的node_modules文件夹(前端同学懂得),IDEA就会一直尝试索引这些根本不需要索引的文件,CPU直接拉满。

解决方案

第一步,手动调整IDEA的内存配置。

找到IDEA安装目录下的idea64.exe.vmoptions文件(Mac在/Applications/IntelliJ IDEA.app/Contents/bin/idea.vmoptions),修改以下参数:

# 建议配置(8G内存机器)
-Xms2048m           # 初始堆内存,建议直接给到2G
-Xmx4096m           # 最大堆内存,给到4G
-XX:ReservedCodeCacheSize=512m   # 代码缓存
-XX:+UseG1GC        # 使用G1垃圾回收器,减少停顿
-XX:+UseStringDeduplication  # 去重字符串,节省内存

第二步,排除不需要索引的目录。

打开 File -> Settings -> Project Structure -> Modules,把那些不需要索引的文件夹(如node_modules.gittargetbuild等)标记为Excluded

转存失败,建议直接上传图片文件

做完这两步,IDEA的流畅度会有一个质的飞跃。

第2个坑:getter/setter报红

现象

本来好好的项目,更新了IDEA或者改了某个配置之后,所有用@Data@Getter注解的类的调用地方突然飘红,编译失败,提示“找不到getXxx方法”。

原因分析

Lombok的工作原理是在编译期通过注解处理器自动生成getter/setter等代码。

IDEA需要安装Lombok插件才能识别这些生成的代码,否则就会报红。

这个坑通常发生在以下几种情况:

  • 升级IDEA后,旧版Lombok插件不兼容
  • 项目的Lombok依赖版本和插件版本不一致
  • 开启了IDEA的“注解处理”但没有正确配置

解决方案

第一步,检查Lombok插件是否安装并启用。File -> Settings -> Plugins 搜索Lombok,确保已安装且勾选。

第二步,打开File -> Settings -> Build, Execution, Deployment -> Compiler -> Annotation Processors,勾选“Enable annotation processing”。

第三步,确保项目的pom.xml或build.gradle中引入了Lombok依赖,并且版本不要太老。推荐版本:

<!-- Maven -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.30</version>
    <scope>provided</scope>
</dependency>

第四步,如果上面三步都做了还是不行,尝试 File -> Invalidate Caches and Restart,清空IDEA的缓存并重启。这个操作能解决IDEA里80%的玄学问题。

有一次我遇到一个特别诡异的情况:同一个项目,同事的IDEA没问题,我的就是报红。

最后发现是.idea目录下的配置文件冲突了,删掉.idea目录让IDEA重新生成就正常了。

第3个坑:Debug断点死活进不去

现象

调试的时候,我在一个Service方法的第一行打了个断点,但是跑起来断点根本不生效,代码直接执行过去了。

更离谱的是,有时候断点上的对勾是灰色的。

原因分析

这个坑有几种可能:

  1. 断点打在不可执行的代码行上:比如接口的方法、空行、注释行。IDEA的断点只能打在可执行的字节码行上。
  2. 开启了“静默断点”或“禁用所有断点”:断点图标上有一个斜线,表示暂时禁用。
  3. 代码被JIT内联优化了:在release模式下,热点方法可能被内联,导致断点位置和源码对应不上。
  4. 多线程环境下,断点被其他线程绕过了:如果你打了条件断点且条件一直为false,自然不会进去。

解决方案

首先,检查断点图标。正常断点是红色圆点,如果带斜线,点击右键取消“Disable”。

或者按 Ctrl + Shift + F8 打开断点管理面板,看看是不是所有断点都被禁用了。

其次,确保断点打在可执行行上。比如:

// ❌ 以下位置不能打断点
public void doSomething() // 方法签名行

// ✅ 这样是可以的
public void doSomething() {
    System.out.println("这里可以打断点");  // 第一行大括号后的有效代码
}

第三,如果是在多线程调试中,检查一下条件断点。IDEA支持在断点上右键设置条件,比如 str == null。如果条件永远不满足,断点当然不会触发。

第四,终极方案:使用 Thread.currentThread().getStackTrace() 打印堆栈来定位问题,或者改用日志输出。

第4个坑:控制台中文乱码

现象

运行项目,控制台打印的日志中,中文全部变成了 ??? 或者 \uXXXX 这样的乱码。

System.out.println("你好") 输出的是“???”。

原因分析

乱码的本质是编码不一致

IDEA的控制台、项目的源文件编码、JVM的默认编码、操作系统编码这四个地方只要有一个对不上,就可能出现乱码。

常见的情况是:

  • 源文件是UTF-8编码,但IDEA控制台用的是GBK
  • 或者反过来,源文件是GBK,控制台用UTF-8
  • JVM的file.encoding参数没有正确设置

解决方案

第一步,统一所有地方的编码为UTF-8。

打开 File -> Settings -> Editor -> File Encodings

  • Global Encoding: UTF-8
  • Project Encoding: UTF-8
  • Default encoding for properties files: UTF-8
  • 勾选“Transparent native-to-ascii conversion”

第二步,修改IDEA控制台的编码。在 Help -> Edit Custom VM Options 中添加:

-Dfile.encoding=UTF-8
-Dconsole.encoding=UTF-8

第三步,对于Maven项目,在pom.xml的maven-surefire-pluginmaven-compiler-plugin中也指定编码:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>

第四步,如果用的是Logback或Log4j,检查日志配置文件的编码,比如Logback:

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        <charset>UTF-8</charset>  <!-- 关键 -->
    </encoder>
</appender>

做完这些配置之后,重启IDEA,乱码问题一般就能解决了。

第5个坑:Git提交时多了.idea文件

现象

用IDEA自带的Git提交代码时,Commit Changes 窗口里总是出现一些不应该提交的文件,比如.idea/workspace.xmltarget/目录下的class文件、.iml文件等。

有时候一不小心就提交上去了,污染了Git仓库。

原因分析

IDEA默认会把项目的.idea目录和.iml文件纳入版本控制,因为这些文件记录了项目的配置信息。

但问题是,这些文件里可能包含本地路径、个人配置等环境相关的信息,不同机器之间不应该共享。

target/目录是编译产物,更不应该提交。

根本原因是没有配置.gitignore文件,或者配置了但IDEA没有正确识别。

解决方案

在项目的根目录下创建.gitignore文件,把以下内容放进去:

# Compiled class file
*.class
target/
out/

# IntelliJ IDEA
.idea/
*.iml
*.iws
*.ipr
.idea/workspace.xml
.idea/tasks.xml
.idea/gradle.xml
.idea/compiler.xml
.idea/libraries/

# Log file
*.log
*.log.gz

# OS generated files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db

然后在IDEA中,打开 Settings -> Version Control -> Ignored Files,确保没有任何冲突的规则。

如果你的.gitignore文件已经在Git仓库中,并且之前已经错误地提交了.idea目录,需要先执行命令从Git缓存中移除:

git rm -r --cached .idea
git commit -m "Remove .idea from git"

之后再提交,就只会看到需要提交的源码文件了。

第6个坑:Maven依赖下载巨慢

现象

在IDEA中刷新Maven项目(Reload All Maven Projects)时,右下角一直在转圈,下载依赖特别慢,有时候直接超时报“Transfer failed”或者“Read timed out”。

原因分析

Maven默认的中央仓库在国外,网络延迟大,下载速度自然慢。

IDEA虽然内置了Maven,但默认会使用Maven自带的settings.xml,其中没有配置国内镜像。

另外,IDEA的Maven和命令行Maven可能会共用同一个本地仓库(~/.m2/repository),如果同时操作,会出现锁文件冲突。

解决方案

第一步,配置国内镜像源。

File -> Settings -> Build, Execution, Deployment -> Build Tools -> Maven 中,找到 User settings file,点击“Override”,然后选择或创建一个settings.xml文件,填入以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 
          http://maven.apache.org/xsd/settings-1.0.0.xsd">
    <mirrors>
        <!-- 阿里云Maven镜像 -->
        <mirror>
            <id>aliyunmaven</id>
            <mirrorOf>central</mirrorOf>
            <name>阿里云公共仓库</name>
            <url>https://maven.aliyun.com/repository/public</url>
        </mirror>
    </mirrors>
    
    <profiles>
        <profile>
            <id>jdk-1.8</id>
            <activation>
                <activeByDefault>true</activeByDefault>
                <jdk>1.8</jdk>
            </activation>
            <properties>
                <maven.compiler.source>1.8</maven.compiler.source>
                <maven.compiler.target>1.8</maven.compiler.target>
                <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
            </properties>
        </profile>
    </profiles>
</settings>

第二步,在Maven设置中,把“Work offline”关掉(除非你真的要离线工作),把“Import Maven projects automatically”打开,这样依赖变更时会自动下载。

第三步,如果你的网络环境特别差,可以尝试配置IDEA的HTTP代理。Settings -> Appearance & Behavior -> System Settings -> HTTP Proxy,如果公司有内网代理,填进去即可。

配置完成后,点击Maven面板上的“Reload All Projects”按钮,下载速度应该明显提升。

第7个坑:代码编译通过,运行却报错

现象

在IDEA里Maven编译没有任何错误,mvn clean compile也成功了。

但是运行main方法或者启动Spring Boot时,控制台报错:java.lang.ClassNotFoundException: com.xxx.SomeClass

原因分析

这个坑的原因很隐蔽:IDEA的编译器和Maven的编译输出目录不一致

IDEA默认的编译输出目录是 项目根目录/out/ 或者 target/classes/,而Maven的编译输出目录是 target/classes/

如果你修改过项目结构,或者IDEA的缓存乱了,可能会导致IDEA运行时用的classpath里找不到某些类。

另一个常见原因是:使用了Lombok,但是IDEA的注解处理器没有生成代码,或者生成的代码路径不对。

解决方案

首先,打开 File -> Settings -> Build, Execution, Deployment -> Compiler,确保“Build project automatically”是勾选的(但注意这会在你保存文件时自动编译,对性能有影响)。

然后,检查 File -> Project Structure -> Modules,看每个module的“Output path”和“Test output path”是否指向了正确的目录。一般来说,Maven项目应该指向target/classestarget/test-classes

转存失败,建议直接上传图片文件

最暴力的解决方法:点击 Build -> Rebuild Project 清空所有编译输出,然后重新编译。如果还不行,执行 File -> Invalidate Caches and Restart 清空缓存。

还有一个绝招:用Maven命令行先打包,然后手动运行打好的jar包,看是不是同样的问题。

如果jar包能运行,那就是IDEA的运行配置有问题;如果jar包也报错,那就是代码本身有依赖问题。

第8个坑:快捷键失灵

现象

习惯了用 Ctrl+CCtrl+V 复制粘贴代码,突然有一天发现快捷键不管用了,或者按下去之后出现奇怪的行为(比如弹出某个面板、删除文字等)。

更离谱的是,Ctrl+Alt+L 格式化代码也无效。

原因分析

IDEA的快捷键冲突通常有两种情况:

  1. 与其他软件的快捷键冲突:比如微信PC版的截图快捷键是Ctrl+Alt+A,和IDEA的一些插件快捷键重复;搜狗输入法的Ctrl+Shift+F会切换简繁体。
  2. IDEA的keymap被无意中修改了:可能是不小心按到了“切换keymap”的快捷键,或者某个插件改动了设置。

解决方案

第一步,检查是否切换了keymap。

打开 File -> Settings -> Keymap,看看当前选中的keymap是不是你常用的(比如Windows默认是Default,Mac是Mac OS X)。如果显示Default copy或者别的,说明被改过了。可以点击“Restore Defaults”恢复默认。

第二步,排查外部软件冲突。

常见的冲突有:

  • 微信:Ctrl+Alt+W
  • 搜狗/微软拼音:Ctrl+Shift+F(简繁体切换)、Ctrl+Shift+E(表情)
  • QQ:Ctrl+Alt+A(截图)
  • 网易云音乐:Ctrl+Alt+上/下(音量)

解决方法是去这些软件里修改快捷键,或者直接关闭它们。我个人的习惯是写代码的时候把聊天软件退了,清净。

第三步,如果只有某个特定快捷键失效,可以在Keymap里搜索这个快捷键的动作,看看是不是被占用了。

比如搜索Reformat Code(格式化代码),默认是Ctrl+Alt+L,如果显示多个动作,说明有冲突,可以右键移除一个。

第9个坑:连不上MySQL

现象

IDEA自带的Database工具(很好用,很多小伙伴可能不知道)连接MySQL时,报错:The server time zone value '???ú±ê×??±??' is unrecognized 或者 Could not create connection to database server.

原因分析

MySQL 8.0以上版本要求明确指定时区参数serverTimezone。IDEA的Database连接配置默认不包含这个参数,导致了错误。

解决方案

在IDEA的Database面板中,点击数据源设置,进入“Advanced”选项卡,手动添加一个参数:

  • Name: serverTimezone
  • Value: Asia/Shanghai 或者 UTC

如果还不行,在“General”页面的URL后面直接加上:

jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf-8

另外,如果是用Spring Boot项目的数据源配置,也建议在连接池的URL中加入这些参数,防止运行时报同样的错。

最后,检查一下MySQL驱动版本。IDEA默认会下载最新的驱动,但如果你的MySQL是5.7版本,用8.x的驱动可能会不兼容。

可以在数据源的“Driver”下拉菜单中选择旧版本。

第10个坑:提交代码时自动格式化

现象

团队协作时,你提交代码前IDEA自动帮你格式化了代码(Ctrl+Alt+L)。

结果提交上去之后,整个文件的缩进、换行、空行全变了。

你的改动可能只有一行,但是git diff里却显示了整个文件几百行的变更。

代码Review的时候,同事根本看不出你到底改了啥。

原因分析

这是IDEA的“崇高”功能——在提交代码时自动执行代码格式化、优化导入等操作。

初衷是好的,希望保持代码风格统一。

但是,如果团队成员没有使用统一的代码格式化规则(比如每个人的缩进设置不同:有的用4空格、有的用2空格、有的用Tab),就会导致互相覆盖、diff爆炸。

解决方案

有两种解决思路:

方案一:统一团队代码格式(推荐)

在项目根目录下放置一个.editorconfig文件,这是各大IDE和编辑器共同遵守的格式规范:

# .editorconfig
root = true

[*]
charset = utf-8
indent_style = space
indent_size = 4
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

[*.java]
indent_size = 4

[*.xml]
indent_size = 2

IDEA会自动识别.editorconfig,并提示是否采用。这样所有人都用同一套规则。

同时,在IDEA中导出代码格式化规则(File -> Settings -> Editor -> Code Style -> Java -> Manage -> Export),把文件放进项目版本控制,让同事导入。

方案二:关闭自动格式化功能

如果你不想自动格式化,可以关掉。打开 File -> Settings -> Version Control -> Commit,把“Reformat code”、“Optimize imports”、“Rearrange code”前面的勾全部取消。

这样一来,提交的时候就只会提交你手动改动的部分,不会动其他代码。当然,你需要自己保证代码格式是OK的。

个人建议采用方案一,这样既保持了代码整洁,又不会引起格式冲突。

总结

好了,10个坑终于讲完了。

我来帮大家快速回顾一下:

序号一句话解决方案
1IDEA越来越卡调大内存 + 排除无需索引的目录
2Lombok失效装插件 + 开启注解处理
3断点进不去打在有效行 + 检查禁用状态
4控制台中文乱码统一UTF-8 + JVM参数
5Git提交了不该提交的文件配置.gitignore + 移除已提交的
6Maven依赖下载慢配置阿里云镜像
7ClassNotFoundException检查编译输出目录 + Rebuild
8快捷键失灵检查keymap + 关闭冲突软件
9数据库时区错误添加serverTimezone参数
10提交时自动改格式统一.editorconfig或关闭自动格式化

最后用一张图来总结一下这些坑的应对思路:

转存失败,建议直接上传图片文件

写这篇文章,一方面是帮大家避坑,另一方面也是对自己这些年IDEA使用经验的一个总结。

工欲善其事,必先利其器

IDEA确实是一个非常强大的工具,但再强大的工具,如果不会用、用不对,也会变成绊脚石。

希望这篇文章能给大家带来实实在在的帮助。

如果你也踩过其他“奇葩”的坑,欢迎在评论区留言分享。

咱们互相学习、共同进步!

更多项目实战在我的技术网站:susan.net.cn/project