解决启动IDEA后CPU 及内存占用过高配置调整

IDEA版本是: IntelliJ IDEA 2025.2

机器是: Mac M1 16G
可以使用IDEA自带的监控来观察在IDEA 中到底是啥进程占用了CPU的资源

网络上大部分讲的都是因为JIT(just in time,即时编译技术)导致CPU飙升,但是经过检测发现,JIT也仅仅是IDEA卡顿的一部分原因。

观测到CPU还是会飙升,但是经过配置后,JIT所占用的CPU 确实大幅下降,说明还是有效果

shell 复制代码
# JIT 参数

# 限制 JIT 编译线程数为 2,避免占用过多 CPU
-XX:CICompilerCount=2

# JIT 编译只到第一级,减少高级优化带来的编译延迟
-XX:TieredStopAtLevel=1

# 限制 inline 展开层级,降低编译复杂度
-XX:MaxInlineLevel=3

# 表示一个方法至少被调用 10 万次 之后,才会被考虑进入 Tier4 编译(最高级别的 JIT 优化)
-XX:Tier4MinInvocationThreshold=100000

# 设置 热点方法被调用多少次后 触发 Tier4 编译
-XX:Tier4InvocationThreshold=110000

# 也就是说方法需要运行 12 万次 之后才会进入最高级别的编译优化
-XX:Tier4CompileThreshold=120000

后续除了JIT相关的配置,还参考了网上其它相关的配置,如栈堆配置

shell 复制代码
#堆栈设置
# 设置 JVM 的初始与最大堆内存为 4 GB,最大和最小内存都保持一致,避免频繁的扩容和缩容
-Xms4096m
-Xmx4096m
# 将新生代(Young Generation)设置为 2 GB
-Xmn1024m
# 元空间(Metaspace)大小设置:通过 -XX:MetaspaceSize 与 -XX:MaxMetaspaceSize 设置为 1 GB,避免因类加载频繁导致的扩容。
-XX:MetaspaceSize=1024m
-XX:MaxMetaspaceSize=1024m
# 启动时预先访问分配的内存页,以减少运行时的内存分配延迟和分页
-XX:+AlwaysPreTouch
# JVM 的代码缓存(JIT 编译后生成的本地机器码)设置得较大,可减少运行期间对代码缓存的频繁扩容。
-XX:InitialCodeCacheSize=1200m
# JVM 的代码缓存(JIT 编译后生成的本地机器码)设置得较大,可减少运行期间对代码缓存的频繁扩容。
-XX:ReservedCodeCacheSize=1200m
# 启用压缩指针,降低对象指针占用空间,提升性能
-XX:+UseCompressedOops
# 确保 IDEA 以 UTF-8 编码运行
-Dfile.encoding=UTF-8

在配置了栈堆之后,发现还是不行,有找了找资料,发现可能和GC收集器有关,所以,将垃圾回收器配置成 G1(之前配置的是CMS)

shell 复制代码
# 使用G1
-XX:+UseG1GC
# 开启字符串去重功能,允许JVM在堆内存中识别出内容相同的多个字符串对象,并将它们合并为单一实例以节省空间。此选项仅与G1垃圾收集器一起使用有效。
-XX:+UseStringDeduplication
# 设置自动装箱缓存的最大大小。具体来说,就是控制Integer、Short等基本类型到其包装类转换时可以缓存的对象数量上限。这里设置为20000意味着对于-20000到20000之间的整数,系统会直接从缓存中获取相应的Integer对象而不是创建新的对象。这有助于减少内存消耗和提高性能。
-XX:AutoBoxCacheMax=20000
# 使用 4 个线程来处理垃圾回收任务,提高收集效率
-XX:ParallelGCThreads=4
# 控制软引用的回收策略,降低内存压力
-XX:SoftRefLRUPolicyMSPerMB=50
-ea # 启用断言,便于调试

以下是完整的配置

shell 复制代码
#堆栈设置
# 设置 JVM 的初始与最大堆内存为 4 GB
-Xms4096m
-Xmx4096m
# 将新生代(Young Generation)设置为 2 GB
-Xmn1024m
# 元空间(Metaspace)大小设置:通过 -XX:MetaspaceSize 与 -XX:MaxMetaspaceSize 设置为 1 GB,避免因类加载频繁导致的扩容。
-XX:MetaspaceSize=1024m
-XX:MaxMetaspaceSize=1024m
# 启动时预先访问分配的内存页,以减少运行时的内存分配延迟和分页
-XX:+AlwaysPreTouch
# JVM 的代码缓存(JIT 编译后生成的本地机器码)设置得较大,可减少运行期间对代码缓存的频繁扩容。
-XX:InitialCodeCacheSize=1200m
# JVM 的代码缓存(JIT 编译后生成的本地机器码)设置得较大,可减少运行期间对代码缓存的频繁扩容。
-XX:ReservedCodeCacheSize=1200m
# 启用压缩指针,降低对象指针占用空间,提升性能
-XX:+UseCompressedOops
# 确保 IDEA 以 UTF-8 编码运行
-Dfile.encoding=UTF-8

# 采用何种垃圾回收参数
# 使用G1
-XX:+UseG1GC
# 开启字符串去重功能,允许JVM在堆内存中识别出内容相同的多个字符串对象,并将它们合并为单一实例以节省空间。此选项仅与G1垃圾收集器一起使用有效。
-XX:+UseStringDeduplication
# 设置自动装箱缓存的最大大小。具体来说,就是控制Integer、Short等基本类型到其包装类转换时可以缓存的对象数量上限。这里设置为20000意味着对于-20000到20000之间的整数,系统会直接从缓存中获取相应的Integer对象而不是创建新的对象。这有助于减少内存消耗和提高性能。
-XX:AutoBoxCacheMax=20000
# 使用 4 个线程来处理垃圾回收任务,提高收集效率
-XX:ParallelGCThreads=4
# 控制软引用的回收策略,降低内存压力
-XX:SoftRefLRUPolicyMSPerMB=50
-ea # 启用断言,便于调试

# JIT 参数
# 限制 JIT 编译线程数为 2,避免占用过多 CPU
-XX:CICompilerCount=2
# JIT 编译只到第一级,减少高级优化带来的编译延迟
-XX:TieredStopAtLevel=1
# 限制 inline 展开层级,降低编译复杂度
-XX:MaxInlineLevel=3
# 表示一个方法至少被调用 10 万次 之后,才会被考虑进入 Tier4 编译(最高级别的 JIT 优化)
-XX:Tier4MinInvocationThreshold=100000
# 设置 热点方法被调用多少次后 触发 Tier4 编译
-XX:Tier4InvocationThreshold=110000
# 也就是说方法需要运行 12 万次 之后才会进入最高级别的编译优化
-XX:Tier4CompileThreshold=120000
# 控制 JVM 内部 路径规范化(canonicalization)缓存 的开关
-Dsun.io.useCanonPrefixCache=false
# 让 JVM 优先使用 IPv4 协议栈,而不是 IPv6
-Djava.net.preferIPv4Stack=true
# 默认情况下,JDK 会禁用一些 HTTP 认证隧道的协议(比如 Basic、Digest)
-Djdk.http.auth.tunneling.disabledSchemes=""
# 当 JVM 抛出 OutOfMemoryError 时,自动生成一个 堆转储文件 (.hprof)
-XX:+HeapDumpOnOutOfMemoryError
# 默认 JVM 对某些高频异常(如 NullPointerException, ArrayIndexOutOfBoundsException)会优化:重复抛时 不再生成完整的栈轨迹,提高性能。
-XX:-OmitStackTraceInFastThrow
# 允许 JVM 附加(attach)到自身进程。这通常用于 Profiler、诊断工具(如 jconsole、jvisualvm、YourKit、Async Profiler) 等需要 attach 的场景。
-Djdk.attach.allowAttachSelf
相关推荐
user_admin_god15 小时前
第 09 篇:实践一 —— 文本摘要(Map-Reduce 分块)
java·人工智能·spring boot·语言模型
咖啡八杯15 小时前
Controller 基类封装:BaseController 的模板方法设计
java·架构·设计
vx_BS8133015 小时前
【项目编号:project49759】Spring Boot 宠物综合服务平台:商城、预约、咨询、活动与健康档案的一体化实现
java·spring boot·eclipse·tomcat·intellij-idea
她的男孩15 小时前
加了 @Idempotent 还是重复扣款了 3 笔:扒完 1279 行幂等 Starter,我挖出 5 个隐蔽的坑
java·后端·架构
步行cgn15 小时前
Spring 注入内部 Bean 详解
java·spring·rpc
user_admin_god15 小时前
第 05 篇:结构化输出 —— 让模型稳定返回 JSON
java·人工智能·spring boot·语言模型
土司大王15 小时前
LeetCode hot100——394.字符串解码:Java 双栈模拟
java·算法·leetcode
邪修king15 小时前
Re:Linux系统篇(二十五):文件系统(一):磁盘硬件底层原理:从物理结构到 CHS/LBA 寻址,搞懂硬盘数据的定位逻辑
java·linux·运维·gpt
驭渊的小故事15 小时前
Spring Boot 注解详解01
java·前端·spring boot
泡海椒15 小时前
jquick-pdf 超详细入门教程:Java 轻量级 HTML 模板生成 PDF 工具
java·开发语言