不要成为Scrooge并为您的IDE提供更多的内存
昨天,我们讨论了有关在IntelliJ IDEA中自定义内存设置的问题,似乎有些人没有这样做,有些人(如我)使用了一些简单的变更集,有些开发人员精心设计了满足他们需求的精美设置。 在为当前项目工作时,我不得不处理几个小型微服务项目和一个较旧的项目,这是客户业务的核心,这是相当大的。 在进行了一些更改之后,我发现在IDE速度和响应速度方面确实有了很大的改进。 但是当时我还没有测量出确切的变化,只是主观地观察到“ IDEA现在更快” 。
但是在那次讨论中,一位为同一客户工作的开发人员(感谢Yuri)向我发送了他的设置,而他们的复杂性确实让我不知所措。 我对自己的设置感到满意,但我也很好奇这些完全不同的设置如何相互比较,以及它们与JetBrains提供的默认设置如何进行比较。 因此,在与Yuri讨论之后,我知道这是写博客文章的好材料。
目标
我的计划是比较在接近我的每日使用量的情况下(加载大项目,加载两个或三个微服务,在假设的git pull之后刷新大项目)不同的IDEA内存设置的性能,然后在涉及内存时选择最佳设置消耗和速度改进。
试验机和项目
笔记本电脑 :MacBook Pro Retina,2,3GHz Intel Core i7、16GB 1600Mhz DDR3,SSD光盘,OS X Yosemite
专案
- 大项目–整体式,700,000行代码(Java 8和Groovy),303个Gradle模块
- 两个微服务–带有10,000至20,000行代码的小型项目(Java 8和Groovy),每个都有一个Gradle模块
测试场景
- 关闭Idea中的所有项目
- 将设置接受测试到idea.vmoptions文件
- 重置我的笔记本电脑
- 开始之后,关闭所有不相关的程序(通讯器等)
- 开放式想法(测量时间)
- 打开大项目(测量时间)
- 检查jstat -gcutil
- 再打开两个项目:微服务一和微服务二(测量时间)
- 检查jstat -gcutil
- 返回大项目并单击“刷新Gradle项目”按钮(测量时间)
- 检查jstat -gcutil
什么是jstat -gcutil
jstat是JDK中可用的工具,用于监视JVM和Garbage Collector统计信息。 它有很多不同的选项来收集各种数据( 完整的文档在这里 ),但是我们只对以下一种感兴趣: -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提供的内置设置,干净的IDEA 15正在使用它们:
-Xms128m
-Xmx750m
-XX:MaxPermSize=350m
-XX:ReservedCodeCacheSize=240m
-XX:+UseCompressedOops
大红)
Xmx为4096MB, ReservedCodeCacheSize为1024MB,这是很大的内存。
-Xms1024m
-Xmx4096m
-XX:ReservedCodeCacheSize=1024m
-XX:+UseCompressedOops
平衡(蓝色)
Xmx为2GB,Xms为2GB,更加均衡的内存消耗方式
-Xms2g
-Xmx2g
-XX:ReservedCodeCacheSize=1024m
-XX:+UseCompressedOops
精致(橙色)
如上所述,Xmx为2GB,Xms为2GB,但是指定了不同的Garbage Collector,并为GC和内存管理指定了许多不同的标志。 我已经从Yuri收到了这些设置。
-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专用的,要了解如何为您的OS更改这些设置,请参阅本文 )。
现在该执行我们的测试方案并比较结果了。
结果
想法启动时间
如您所见,启动时间不取决于内存设置。 无论我们分配多少内存,所有测试方案的创意启动时间都约为10秒。 这并不奇怪,因为这些设置不会在早期阶段影响应用程序的行为。
加载大型项目的时间
好的,现在是时候加载我们的Monolith及其70万行代码了。
最后有一些区别。 默认设置的性能几乎是其他设置的三倍。 显然,如此大的代码库需要更多的内存:)如果执行
jstat -gcutil <IDEA_PID>
我们将注意到,当我们将其与其他设置进行比较时,Garbage Collector确实非常忙于默认设置。
GC不仅在释放内存上花费的总时间显着增加(大约高出50倍),而且Full GC的平均执行时间要长得多。 长时间花在Full GC上是导致我们IDE响应速度低的主要原因。
在IDEA中打开两个微服务
好的,我们已经加载了Monolith,但是我们需要向两个较小的微服务中添加一些代码。 因此,让我们在IDEA中打开它们并比较总时间。
在这个测试场景中,我们看到,差异仍然可见和复杂胜这里, 默认是远远落后于其他地区。
再次使用jstat -gcutil
加载两个微服务后,我们可以检查垃圾收集器在三个打开的项目中的性能。 我们可以看到三个自定义设置看起来几乎相同,并且默认设置的结果非常非常差。
最后阶段:重新加载Monolith
因此,我们已经编码了一段时间,现在我们需要从存储库中获取最新版本的The Big Project,然后刷新Gradle Project,以便IDEA可以看到所有新类,等等。
重要说明 :默认设置的标准太高了,因为IDEA在刷新期间崩溃了,我无法测量实际时间。 简单分配的内存不足以执行此操作。
但是从最好的三个方面来看,我们看到大设置可以在最短的时间内刷新项目,因此最大的分配内存在这里有所帮助。
最后一次使用jstat -gcutil
因为IDEA无法使用默认设置刷新projet,所以它们不包括在此度量中。
在这最后的图表我们可以看到,总次数之间的差异是相当小的,但单一的全GC是最快的大设置应用。 再次,看起来非常大的Xmx有助于提高响应能力。
摘要
在这个简短的实验中,我尝试测试通过自定义IntelliJ IDEA的内存设置可以获得多少收益,看起来,即使是一些简单的调整也可以大大提高IDE的性能并加快工作速度。 当然,分配的内存越多,您看到的效果就越好,但是我们在许多也会消耗内存的不同应用程序旁边使用IDE,因此我们的目标应该是在性能增益和内存消耗之间找到平衡。 我认为在大多数情况下,将Xmx设置为2g到3g之间的值是最好的方法。 如果您还有更多时间,可以使用jstat和jvisualm来检查更改不同的VM标志如何影响性能和内存占用。
你呢?
那你呢 您的idea.vmoptions设置是什么? 您还有其他方法可以改善InteliJ IDEA的性能吗?
翻译自: https://www.javacodegeeks.com/2015/11/one-one-reason-customize-intellij-idea-memory-settings.html