在和共事的一次探讨中发现,对 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   GCT89.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万+码农成长充电第一站,陪有幻想的你一起成长