IntelliJ启动项目出现 CodeCache 报警原因分析以及排查(基于 JDK 8)
IntelliJ 启动项目出现 CodeCache 报警原因分析以及排查(基于 JDK 8)
一、问题背景
最近在用 IntelliJ IDEA 本地启动项目(单体)时,控制台突然出现一段系统级报警信息:
CodeCache: size=262144Kb used=25874Kb max_used=25979Kb free=236270Kb bounds [0x0000000104548000, 0x0000000105eb8000, 0x0000000114548000] total_blobs=13056 nmethods=12200 adapters=778 compilation: disabled (not enough contiguous free space left) OpenJDK 64-Bit Server VM warning: CodeCache is full. Compiler has been disabled. OpenJDK 64-Bit Server VM warning: Try increasing the code cache size using -XX:ReservedCodeCacheSize=
程序虽然能跑起来,但这提示意味着 JIT 编译被关闭了,性能可能会受到影响,特别是对于大型或长时间运行的服务来说,得引起重视。
二、报警信息解析
关键提示内容如下:
CodeCache is full. Compiler has been disabled.
也就是说,JVM 的 代码缓存区(CodeCache)已满,因此 JIT 编译器(Just-In-Time Compiler)被禁用了。
1. 什么是 CodeCache?
CodeCache 是 JVM 用来缓存 JIT 编译后生成的本地机器代码的一块内存区域,主要用于提升运行效率。如果这个区域满了,JVM 就会停止 JIT 编译,直接解释执行 Java 字节码,效率会大打折扣。
通俗理解:
当 JVM 运行时,它会将一些频繁执行的方法编译成更快的本地代码(native code),这叫 JIT 编译(Just-In-Time Compilation)。这些编译后的本地代码需要放到一个“地方”来运行,这个地方就是 CodeCache。
2. 为什么还有空闲却被禁用了?
这句是关键:
not enough contiguous free space left
说明虽然整体还有空间,但没有足够连续的内存块供 JIT 编译器使用。
三、JDK 8 的默认配置
1. 什么是ReservedCodeCacheSize?
ReservedCodeCacheSize 是 JVM 的一个非标准(-XX 开头)的参数,用于设置 JIT 编译器生成的本地机器代码所使用的最大内存空间大小,也就是我们说的 代码缓存区(CodeCache)。
2. jdk默认配置
我用的是 JDK 8,对应默认的 CodeCache 配置如下:
-XX:ReservedCodeCacheSize=128m
相比于 JDK 11(默认 240MB 或更大),JDK 8 的这块配置明显偏小,尤其是在项目比较大、模块较多的情况下,很容易不够用。
四、常见触发原因
1. 造成 CodeCache 报警的原因通常有以下几种:
2. 项目代码量大,类太多
针对我这个项目的情况分析:
单体项目通常是一个“大杂烩”,服务全堆一起,类和方法成千上万、代码复杂。
单体项目运行久了更容易出现 JVM 层面的问题,特别是 CodeCache、JIT 编译、内存碎片、类加载等方面。JVM 启动后会不断加载类、解释执行、JIT 编译,CodeCache 一点点被填满。如果方法分布广,JVM 编译的 native code 就会越来越多。
3. 项目运行时间较长,缓存累积导致空间碎片化
4. 频繁热部署或使用 Debug 模式
5. IDE 插件(如 Lombok、AOP、Spring 代理等)触发了大量动态编译
6. JVM 本身的 CodeCache 空间配置过小(如默认的 128MB)
五、排查与处理步骤
1. 确认报警是否频繁出现
多次重启项目观察日志,如果每次都有报警,那基本就可以确定是 CodeCache 空间不足了。
2. 查看当前 JVM 启动参数
在 IDEA 的 Run/Debug Configurations 中查看 VM options,确认是否设置了相关参数。
具体步骤如下:
1) 打开菜单:点击顶部菜单栏中的
Run → Edit Configurations...
2) VM options 参数设置
在弹出的窗口中,左侧选中你要修改的运行配置(比如一个 Application 配置)
找到右侧的 VM options 输入框,填入你要设置的参数,比如:

3. 手动扩大 CodeCache 空间
-XX:InitialCodeCacheSize=64m # 设置 CodeCache(JIT 编译代码缓存)的初始分配大小为 64MB,默认比较小,适当增大可减少初始化时频繁扩容 -XX:ReservedCodeCacheSize=256m # 设置 CodeCache 的最大大小为 256MB,当达到这个限制时,JVM 会停止 JIT 编译,建议根据项目大小适当调大 -XX:+UseCodeCacheFlushing # 启用 CodeCache 回收机制,当缓存区快满时,JVM 可以回收旧的、无用的已编译代码,防止缓存耗尽(建议开启) -XX:+PrintCommandLineFlags # 启动时输出所有生效的 JVM 参数,包括默认值和手动设置的,方便排查和确认参数是否生效
如下图:

当然,堆的内存大小也可以进行简写,如:-Xms<size> 如:-Xms2g(堆的初始大小),-Xmx<size> 如:-Xmx4g(堆的最大内存)
4. 验证结果
重新启动后,观察控制台是否还输出 CodeCache 报满的警告

六、优化建议
1. 定期清理冗余类、依赖和未使用模块
2. 合理 JVM 参数配置
3. 中长期架构调整
4. 避免一次性加载大量子模块
5. 关闭不必要的 IDEA 插件,尤其是可能参与编译流程的插件
6. 使用 Release 模式运行项目(Debug 会触发更多编译)
七、总结
CodeCache 报警虽然不会导致程序直接崩溃,但如果 JIT 编译被禁用,性能就会下降,影响稳定性和响应速度。
如果使用的是 JDK 8,建议直接将 CodeCache 的空间调大一些,特别是在开发中使用大型项目或多模块项目时。

浙公网安备 33010602011771号