在和同事的一次讨论中发现,对 IntelliJ IDEA 内存采用不一样的设置方案,会对 IDE 的速度和响应能力产生不一样的影响。
Don’t be a Scrooge and give your IDE some more memoryjava
不要作守财奴,给IDE多留点内存吧。git
昨天,你们就是否自定义IntelliJ IDEA 的内存设置进行了讨论,有些人选择默认设置,有些人会对默认的设置进行简单的变动,还有一些开发者会基于他们的需求进行全面复杂的设置。笔者目前的工做是处理几个微服务项目和一个老项目,而客户的核心业务需求很是大。对 IntelliJ IDEA 内存进行简单设置之后,笔者明显感觉到了该 IDE 在速度和响应方面的改善。但当时笔者并未进行具体的测量,因此这只是主观感觉而已。微信
不过,参与讨论的一位开发者给笔者发了一份他的设置,虽然是针对同个项目,该设置却极其复杂。笔者对本身的设置并没有不满,但很是好奇,这些彻底不一样的设置对比 JetBrains 提供的默认设置,会有怎样的不一样。intellij-idea
目标机器学习
笔者的计划是,在一个接近平常开发项目的场景下(加载一个大项目、加载二、3个微服务、git pull 后刷新大项目),测试各个设置带来的效果,并选出内存消耗和速度都达到最优时的最佳设置。ide
测试机器和项目微服务
笔记本电脑: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/th...
做者:小哈学Java欢迎关注个人微信公众号「码农突围」,分享Python、Java、大数据、机器学习、人工智能等技术,关注码农技术提高•职场突围•思惟跃迁,20万+码农成长充电第一站,陪有梦想的你一块儿成长