在和共事的一次探讨中发现,对 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/th…
作者:小哈学 Java
欢送关注我的微信公众号「码农解围」,分享 Python、Java、大数据、机器学习、人工智能等技术,关注码农技术晋升•职场解围•思维跃迁,20 万 + 码农成长充电第一站,陪有幻想的你一起成长