在和同事的一次讨论中发现,对 IntelliJ IDEA 内存采用不同的设置方案,会对 IDE 的速度和响应能力产生不同的影响。

Don’t be a Scrooge and give your IDE some more memory

不要做守财奴,给IDE多留点内存吧。

昨天,大家就是否自定义IntelliJ IDEA 的内存设置进行了讨论,有些人选择默认设置,有些人会对默认的设置进行简单的变更,还有一些开发者会基于他们的需求进行全面复杂的设置。笔者目前的工作是处理几个微服务项目和一个老项目,而客户的核心业务需求非常大。对 IntelliJ IDEA 内存进行简单设置以后,笔者明显感受到了该 IDE 在速度和响应方面的改善。但当时笔者并未进行具体的测量,所以这只是主观感受而已。

不过,参与讨论的一位开发者给笔者发了一份他的设置,虽然是针对同个项目,该设置却极其复杂。笔者对自己的设置并无不满,但非常好奇,这些完全不同的设置对比 JetBrains 提供的默认设置,会有怎样的不同。

目标

笔者的计划是,在一个接近日常开发项目的场景下(加载一个大项目、加载2、3个微服务、git pull 后刷新大项目),测试各个设置带来的效果,并选出内存消耗和速度都达到最优时的最佳设置。

测试机器和项目

笔记本电脑:MacBook Pro Retina, 2.3GHz Intel Core i7, 16GB 1600Mhz DDR3,SSD Disc, OS X Yosemite

项目

大项目—— Monolith ,70万行代码( Java[1] 8 和 Groovy ),303个Gradle模块

两个微服务——约有10000——20000行代码( Java 8 和 Groovy )的小项目,各有一个Gradle模块

测试场景

1.在 Idea 中关闭所有项目
2.基于测试文件 idea.vmoptions 进行设置
3.重启电脑
4.启动后关闭所有不相关的项目( communicators 等等)
5.打开 Idea(测试时间)
6.打开大项目(测试时间)
7.检查 jstat -gcutil
8.打开两个微服务项目(测试时间)
9.检查 jstat -gcutil
10.返回大项目然后点击“刷新 Gradle 项目”按钮(测试时间)
11.检查 jstat -gcutil

jstat -gcutil

jstat 是 JDK 自带的工具,主要利用 JVM 内建的指令对 Java 应用程序的资源和性能进行实时的命令行监控,还包括对 Heap size 和垃圾回收状况的监控。它有许多选项来收集各种数据,但这里只会用到:

-gcutil :

-gcutil - Summary of garbage collection statistics.
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 young generation GC events.
YGCT: Young generation garbage collection time.
FGC: Number of full GC events.
FGCT: Full garbage collection time.
GCT: Total garbage collection time.

这个命令的输出结果如下:

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 事件( YGC 和 FGC )次数和收集时间( YGCT 和 FGCT )。

测试设置

笔者设置了四种不同的设置,为了好记,给它们起了不同的名字。

默认(灰色标识)

JetBrains 提供的默认设置:

-Xms128m
-Xmx750m
-XX:MaxPermSize=350m
-XX:ReservedCodeCacheSize=240m
-XX:+UseCompressedOops

Big(大)(红色标识)

给 Xmx 配 4096MB, ReservedCodeCacheSize 设置 1024MB,这已经是相当多的内存了:

-Xms1024m-Xmx4096m-XX:ReservedCodeCacheSize=1024m-XX:+UseCompressedOops

Balanced(平衡的)(蓝色标识)

Xmx 和 Xms 都分配 2GB ,这是相当平衡的内存消耗:

-Xms2g
-Xmx2g
-XX:ReservedCodeCacheSize=1024m
-XX:+UseCompressedOops

Sophisticated(复杂的)(橘色标识)

和上面一样, Xmx 和 Xms 都分配2GB,但是给 GC 和内存管理指定不同的垃圾回收器和许多不同的标志:

-server
-Xms2g
-Xmx2g
-XX:NewRatio=3
-Xss16m
-XX:+UseConcMarkSweepGC
-XX:+CMSParallelRemarkEnabled
-XX:ConcGCThreads=4
-XX:ReservedCodeCacheSize=240m
-XX:+AlwaysPreTouch
-XX:+TieredCompilation
-XX:+UseCompressedOops
-XX:SoftRefLRUPolicyMSPerMB=50
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-Djsse.enableSNIExtension=false
-ea

以上便是笔者的测试设置,为了执行该测试用例,还需要在~/Library/Preferences/IntelliJIdea15/下创建一个idea.vmoptions文件(这是 Mac OS 系统下的路径设置,基于你的操作系统进行设置)

现在,执行测试用例并比较结果。

结果

Idea启动时间

正如上图所示,启动时间并不依赖于内存设置。Idea 在所有场景下的测试时间都是10秒,无论内存分配有多少。这并不足为奇,因为在此早期阶段,这些设置并不会影响到应用的行为。

加载大项目花费的时间

现在加载 Monolith 项目及其70万行代码。终于,出现了一些的差异。默认设置所花费的时间几乎是其它的3倍。很明显,如此庞大的代码库需要更多的内存。如果我们执行:

jstat -gcutil <IDEA_PID>

会发现,对比其它设置, GC 在默认设置下会变得异常忙碌。


不仅 GC 释放内存的总时间非常高(几乎达到了50倍),而且 Full GC 的平均执行时间也非常非常长。大量的时间都花在了 Full GC 上面,这是 IDE 响应速度低的主要原因。

在IDEA中打开两个微服务

现在加载这两个微服务项目,在 IDEA 中打开并且对比他们所消耗的时间。

在这个测试用例下,差异还是非常明显的,复杂设置表现最佳,而默认设置仍旧输给了其他两种设置。

再次使用jstat –gcutil

加载完两个微服务项目后,来检查一下同时打开3个项目的情况下, GC 的表现情况。经测试发现,3个不同的自定义设置表现几乎差不多,而默认设置简直弱爆了。


最后的角逐:重新加载Monolith

现在,笔者需要从仓库中获得 Monolith 项目的最新版本,并且刷新 Gradle 模块,这样, IDEA 能看到所有的新类。

重要提示:代表默认设置的灰色条形柱非常高,因为 IDEA 在刷新过程中崩溃了,笔者无法测量实际时间。显然,默认分配的内存不足以执行该操作。

但从三个自定义例子中可以发现,大内存配置花费的时间是最短的。所以,内存分配还是起到了作用。

最后一次使用jstat-gcutil

因为 IDEA 在默认设置下无法刷新项目,所以,这次测试默认设置就不包括在里面。


从上图可以看出,三者之间的差异不大,但是 Big 配置下的 Full GC 执行时间最快。此外, Xmx 内存大些对响应能力提升的帮助非常明显。

总结

在这次简短的实验中,大家可以发现,即使对 IntelliJ IDEA 内存进行微调,都可以大大提升 IDE 性能。当然,内存分配越多,执行效果就越好。但是,你也会发现, IDE 之外许多其他应用程序也需要消耗内存,所以,大家的目标应该是在提高性能和内存消耗之间找到一个平衡。

笔者认为,在大多数情况下,把 Xmx 值设置在 2G 和 3G 之间是最佳的。如果你有更多的时间可以用 jstat 和 jvisualm 检查用不同的 JVM 设置如何影响性能和内存占用。

翻译:https://dzone.com/articles/the-one-and-only-reason-to-customize-intellij-idea

作者:小哈学Java

欢迎关注我的微信公众号「码农突围」,分享Python、Java、大数据、机器学习、人工智能等技术,关注码农技术提升•职场突围•思维跃迁,20万+码农成长充电第一站,陪有梦想的你一起成长

IDEA 卡成球了 !咋优化 ?相关推荐

  1. IntelliJ IDEA 更新后,电脑卡成球,该如何优化?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | https://urlify.cn/NBBbam 在和同 ...

  2. IntelliJ IDEA 卡成球了?

    在和同事的一次讨论中发现,对 IntelliJ IDEA 内存采用不同的设置方案,会对 IDE 的速度和响应能力产生不同的影响. Don't be a Scrooge and give your ID ...

  3. 高通CVPR神研究:视频处理计算量降低78%,教卷积层自己“挑像素”,卡成PPT的视频纵享丝滑...

    萧箫 发自 凹非寺 量子位 报道 | 公众号 QbitAI 图像领域,已经限制不住AI算法大牛们的身手了. 现在,随着视频产业火热发展,相关算法也正成为计算机视觉研究的新潮流. 毕竟日常生活中,无论是 ...

  4. 现在梦三国2服务器不稳定,《梦三国2》拒绝卡顿 从自我电脑优化开始

    原标题:<梦三国2>拒绝卡顿 从自我电脑优化开始 游戏卡顿一直是玩竞技游戏时头疼的问题.游戏卡顿也是战力匹配上分时的噩梦.尤其是每天晚上双倍战力时间段,出现卡顿的几率会更高.我们都知道梦三 ...

  5. 苹果a10处理器_iPhone运行安卓系统卡成翔,苹果A系处理器彻底跌落神坛!

    使用iPhone的很多果粉都是有一种莫名的优越感,认为iPhone就是比安卓手机要牛X得多,这种牛X并不光光是品牌价值上的,更多则是在体验方面的,iPhone在日常流畅度,运行大型游戏的帧率和稳定性上 ...

  6. linux df -h卡成狗

    今天遇到一个很奇怪的问题,在一台linux执行df -h查看磁盘使用情况,发现卡成狗,于是着手去解决: 1.通过strace df -h追踪是卡在什么位置 [root@new_web ~]# stra ...

  7. a12处理器怎么样_iPhone运行安卓系统卡成翔,苹果A系处理器彻底跌落神坛!

    使用iPhone的很多果粉都是有一种莫名的优越感,认为iPhone就是比安卓手机要牛X得多,这种牛X并不光光是品牌价值上的,更多则是在体验方面的,iPhone在日常流畅度,运行大型游戏的帧率和稳定性上 ...

  8. 用R3写卡成PRL302,解决新电信卡PRL301只能1X不能上3G问题

    用R3写卡成PRL302,解决新电信卡PRL301只能1X不能上3G问题 参考文章: (1)用R3写卡成PRL302,解决新电信卡PRL301只能1X不能上3G问题 (2)https://www.cn ...

  9. YQP36预加水盘式成球机设计(论文+DWG图纸)

    下载链接: https://download.csdn.net/download/dwf1354046363/21780170 课题名称:YQP36预加水盘式成球机设计 课题来源.课题研究的主要内容及 ...

  10. matlab如何画动态圆弧,几何画板动态演示转弧成球的过程

    在数学中,我们都知道,圆弧是指圆上任意两点间的部分,简称弧.几何画板作为演示数学几何图形的必备工具,可以形象地演示图形的变换过程,甚至是由平面图形变换为立体图形也是可以的.比如可以用几何画板演示转动弧 ...

最新文章

  1. QQ超市模拟排配2D版1.13 (XNA4.0) (修正双格货架移动的一个bug和3-5地图)
  2. 自动跟随机器人:一种简易的自动跟随方案,自动跟随小车、自动跟随平衡小车、STM32、基于超声波的自动跟随小车
  3. 通用网页调用本地应用程序方案(windows平台)
  4. linux wkhtmltopdf换字体,ubuntu – 更新后Wkhtmltopdf字体大小增加
  5. azure模型训练_如何在Azure Machine Learning Studio上开发K-Means模型
  6. 计算机专业三年级的学生英语,计算机专业英语 计算机专业英语对照表.doc
  7. Gstreamer之GstBuffer(十八)
  8. Hibernate一对多双向、单向
  9. 忘记PDF密码怎么办?
  10. 法务管理项目结项了mark一下
  11. 智能化弱电系统工程部分规程
  12. SVN checkout 之后图标没有显示(绿色勾)的问题
  13. 使用ARCore+Unity概述
  14. 以TFP401A为核心的DVI接口应用系统
  15. 流程图(flowchart)语法
  16. blender中的灯光和相机
  17. P02014182王子恒信息论作业
  18. python字符串格式时间转化为时间戳
  19. 工程伦理 第一章习题 答案
  20. 【xitongshoucang.com】vista登录界面在win 7系统中如何保留

热门文章

  1. java ee性能_如何进行Java EE性能测试与调优
  2. 论文笔记_S2D.11-2018-ECCV_用于语义分割和深度估计的联合任务递归学习
  3. oralce数据库创建同义词
  4. ubuntu使用笔记
  5. Linux的sleep()和usleep()的使用和区别
  6. IOS访问webserver接口
  7. springmvc + ibatis 框架的搭建
  8. C# delegate ,Action,Func
  9. RTT distribution of Internet
  10. 【GCC调试程序C语言问题】对‘ceil’未定义的引用/已经包含头文件仍然提示未定义的引用