发布时间:2025-05-22
浏览次数:0
IDEA 内存优化最佳实践 技术分享 第1张
请别再当懒虫,给你的集成开发环境多投入一些精力。
不要做守财奴,给IDE多留点内存吧。
昨日,众人围绕是否调整IDE的内存配置展开了热烈讨论,部分同仁倾向于采用预设值,另有部分同僚对预设进行了轻微调整,而部分开发者则是根据自身需求进行了全面且细致的配置。目前,笔者正忙于数个微服务项目的维护以及一个老旧项目的处理工作,客户的业务需求尤为关键且繁重。在完成对 IDEA 内存进行基础配置之后,我明显察觉到了该集成开发环境在运行速度和反应速度上的提升。然而,当时我并未进行详尽的测试,因此这仅是基于个人体验的判断。
然而,一位参与讨论的开发者为笔者提供了一份他的配置方案,尽管它与讨论的项目相同,但该方案显得异常繁复。笔者对自己的配置并无任何抱怨,却对这份与众不同的配置方案充满好奇,想知道它与项目提供的标准配置相比,会产生哪些差异。
目标
笔者的目标是在与日常开发项目相似的情境中(如加载一个大型项目、同时加载两三个微服务、执行git pull操作并刷新大项目),检验不同配置所产生的影响,最终确定在内存使用和运行速度均达到最佳状态时的理想配置。
测试机器和项目
项目
测试场景
[]
基于测试文件 idea. 进行设置
重启电脑
启动后关闭所有不相关的项目( 等等)
打开 Idea(测试时间)
打开大项目(测试时间)
检查 jstat -
打开两个微服务项目(测试时间)
检查 jstat -
返回大项目然后点击“刷新 项目”按钮(测试时间)
检查 jstat -
jstat -
jstat 是 JDK 内置的一项功能,主要功能是通过 JVM 内置的指令对 Java 应用程序的资源使用情况和性能表现进行实时监控。该工具还涵盖了 Heap size 和垃圾回收情况等方面的监控。它提供了丰富的选项以收集各类数据(详细文档可查阅),然而在本例中,我们将仅使用其中的部分选项:-。
-gcutil - Summary of垃圾回收数据统计。
S0: Survivor space 0 utilization as a percentage of the space's current capacity.
S1: Survivor space 1 utilization as a percentage of the space's current capacity.
E: Eden space utilization as a percentage of the space's current capacity.
O: Old space utilization as a percentage of the space's current capacity.
M: Metaspace utilization as a percentage of the space's current capacity.
CCS: Compressed class space utilization as a percentage.
YGC: Number of年轻一代的GC活动。
青年时代垃圾清理时刻。
FGC: Number of full GC events.
FGCT:完整垃圾回收时长。
GCT:总体垃圾回收时长。
这个命令的输出结果如下:
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
89.70 0.00 81.26 74.27 95.68 91.76 40 2.444 14 0.715 3.159
本文着重探讨的几个关键指标包括GC事件(包括年轻代GC和Full GC)的发生频率以及相应的耗时(即年轻代GC耗时YGCT和Full GC耗时FGCT)。
测试设置
笔者设置了四种不同的设置,为了好记,给它们起了不同的名字。
默认(灰色标识)
提供的默认设置:
-Xms128m
-Xmx750m
-XX:MaxPermSize=350m
XX配置项中,保留代码缓存的大小被设定为240兆字节。
-XX:+UseCompressedOops
Big(大)(红色标识)
给 Xmx 配 , e 设置 ,这已经是相当多的内存了:
-Xms1024m
-Xmx4096m
XX:请确保预留的代码缓存大小设置为1024兆字节。
-XX:+UseCompressedOops
(平衡的)(蓝色标识)
Xmx与Xms均设定为2GB,这样的内存分配相当适中intellij idea mac,既不过度消耗资源,又能满足应用需求。
-Xms2g
-Xmx2g
-XX:ReservedCodeCacheSize=1024m
-XX:+UseCompressedOops
(复杂的)(橘色标识)
与之前相同,Xmx与Xms均设定为2GB,然而,在垃圾回收器及内存管理方面,我们选择了不同的回收机制,并设置了众多独特的参数。
-server
-Xms2g
-Xmx2g
-XX:NewRatio=3
-Xss16m
-XX:+UseConcMarkSweepGC
-XX:+CMSParallelRemarkEnabled
-XX:ConcGCThreads=4
-XX:ReservedCodeCacheSize=240m
-XX:+AlwaysPreTouch
-XX:+TieredCompilation
-XX:+UseCompressedOops
XX:设置每兆字节软引用回收策略的毫秒数为50
-Dsun.io.useCanonCaches=false
启用IPv4网络栈,确保程序运行时优先使用IPv4协议。
禁用SNI扩展功能设置,值为false。
-ea
这即是作者所设定的测试环境,要实施这一测试案例,还需在指定路径下建立一个名为idea的文件(该路径为Mac OS系统中的设置,请参阅本文,并根据您的操作系统进行相应的调整)。
现在,执行测试用例并比较结果。
结果Idea启动时间
IDEA 内存优化最佳实践 技术分享 第2张
正如图表所展示,启动速度并不受内存配置的影响。在所有测试场景中,Idea的运行时长均为10秒钟,内存的分配量并不改变这一结果。这种情况并不令人意外,因为在应用的初期阶段,这些配置尚未对应用的表现产生作用。
加载大项目花费的时间
当前正在导入该项目及其包含的70万行代码。经过一番努力,我们发现了若干差异。按照默认配置进行加载,所需时间几乎是其他配置的三倍之多。显而易见,如此庞大的代码库对内存的需求量更大。若我们执行:
jstat -gcutil <IDEA_PID>
会发现,对比其它设置, GC 在默认设置下会变得异常忙碌。
IDEA 内存优化最佳实践 技术分享 第3张
IDEA 内存优化最佳实践 技术分享 第4张
GC 释放内存所需的总时长异常漫长(几乎增至50倍),同时 Full GC 的平均运行时间亦极为漫长。大量时间被 Full GC 所占用,这直接导致了 IDE 响应速度的显著降低。
在IDEA中打开两个微服务
启动这两个微服务项目,然后在 IDEA 环境下逐一查看,并对它们运行所需的时间进行比对。
IDEA 内存优化最佳实践 技术分享 第5张
在本次测试案例中,差异显著可见,复杂配置展现出卓越性能intellij idea mac,与此同时,默认配置依旧未能战胜其他两种配置。
再次使用jstat –
完成两个微服务项目的加载后,我决定对同时开启三个项目时的GC性能进行一番检验。测试结果显示,三个项目各自采用的不同自定义配置在性能上几乎一致,然而,系统默认的配置却显得相当不堪一击。
IDEA 内存优化最佳实践 技术分享 第6张
IDEA内存优化技术分享会,第七张幻灯片呈现的终极对决:内存重新加载策略。
目前,作者必须从储存设施中提取该项目的最先进版本,同时更新模块,以便IDEA能够识别出所有新增的类别。
IDEA 内存优化最佳实践 技术分享 第8张
请注意:该提示中的灰色条形柱高度显著,这是因为IDEA在刷新阶段出现了崩溃,导致作者未能获取到真实的时间数据。显而易见,系统默认分配的内存容量不足以支撑这一操作。
通过观察三个自设的案例,我们可以看出,在配置较大内存时所需的时间相对较少。由此可见,内存的分配确实发挥了其应有的作用。
最后一次使用jstat-
由于 IDEA 在其预设配置中不具备项目刷新的功能,因此在本轮测试中,我们未将默认配置纳入考量范围。
IDEA 内存优化最佳实践 技术分享 第9张
IDEA 内存优化最佳实践 技术分享 第10张
观察图表可发现,三者间的区别并不显著,然而在Big配置下,Full GC的运行速度明显较高。再者,适当增加Xmx内存容量,对系统响应速度的提升效果尤为显著。
总结
在这场简短的实验里,大家注意到,即便对IDE的内存进行细微调整,也能显著增强其性能。显然,内存分配得越多,其运行效果就越佳。然而,同时也会察觉到,除了IDE之外,众多其他应用程序同样需要占用内存。因此,我们的目标便是在提升性能与控制内存消耗之间寻求一个合理的平衡点。作者认为,通常将 Xmx 参数设定在2G至3G的范围内效果最佳。若您拥有充裕的时间,不妨利用 jstat 工具来监测,观察不同的 JVM 配置对性能与内存消耗的具体影响。
讨论
你的想法在设置上是如何安排的?另外,你还有哪些途径可以用来增强 IDEA 的运行效率吗?我们何不就此展开一番交流探讨呢?
对 Dubbo、Netty 等开源项目的源代码及内部机制抱有浓厚兴趣的朋友,不妨加入我的知识星球进行探讨。扫描下方二维码即可参与:,长按即可识别。
目前在知识星球更新了《Dubbo 源码解析》目录如下:
01. 调试环境搭建
02. 项目结构一览
03. 配置
04. 核心流程一览
05. 拓展机制 SPI
06. 线程池
07. 服务暴露
08. 服务引用 Refer
09. 注册中心
10. 动态编译
11. 动态代理 Proxy
12. 服务调用
13. 调用特性
14. 过滤器
15. NIO 服务器
16. P2P 服务器
17. HTTP 服务器
18. 序列化
19. 集群容错
20. 优雅停机
21. 日志适配
22. 状态检查
23. 监控中心
24. 管理中心 Admin
25. 运维命令 QOS
26. 链路追踪
... 一共 69+ 篇
目前在知识星球更新了《Netty 源码解析》目录如下:
01. 调试环境搭建
02. NIO 基础
03. Netty 简介
04. 启动
05. 事件轮询
06. 通道管道
07. 通道
08. 字节缓冲区
09. 通道处理器
10. 编解码 Codec
11. 工具类 Util
... 一共 61+ 篇
目前在知识星球更新了《数据库实体设计》目录如下:
01. 商品模块
02. 交易模块
03. 营销模块
04. 公用模块
... 一共 17+ 篇
目前在知识星球更新了《 源码解析》目录如下:
01. 调试环境搭建
02. IoC 定位
03. IoC 载入
04. IoC 注册
05. IoC Bean 获取
06. IoC Bean 生命周期
... 一共 35+ 篇
源码不易↓↓↓↓↓
如有侵权请联系删除!
Copyright © 2023 江苏优软数字科技有限公司 All Rights Reserved.正版sublime text、Codejock、IntelliJ IDEA、sketch、Mestrenova、DNAstar服务提供商
13262879759
微信二维码