【转载】IntelliJ IDEA 内存优化最佳实践

本文转自 http://blog.oneapm.com/apm-tech/426.htmlhtml

【编者按】本文做者在和同事的一次讨论中发现,对 IntelliJ IDEA 内存采用不一样的设置方案,会对 IDE 的速度和响应能力产生不一样的影响。java

IntelliJ IDEA 内存优化最佳实践 技术分享 第1张

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

不要作守财奴,给IDE多留点内存吧。服务器

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

不过,参与讨论的一位开发者给笔者发了一份他的设置,虽然是针对同个项目,该设置却极其复杂。笔者对本身的设置并没有不满,但很是好奇,这些彻底不一样的设置对比 JetBrains 提供的默认设置,会有怎样的不一样。oracle

目标

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

测试机器和项目

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

项目ide

  • 大项目—— Monolith ,70万行代码( Java 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启动时间

IntelliJ IDEA 内存优化最佳实践 技术分享 第2张

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

加载大项目花费的时间

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

jstat -gcutil <IDEA_PID>

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

IntelliJ IDEA 内存优化最佳实践 技术分享 第3张

IntelliJ IDEA 内存优化最佳实践 技术分享 第4张

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

在IDEA中打开两个微服务

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

IntelliJ IDEA 内存优化最佳实践 技术分享 第5张

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

再次使用jstat –gcutil

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

IntelliJ IDEA 内存优化最佳实践 技术分享 第6张

IntelliJ IDEA 内存优化最佳实践 技术分享 第7张

最后的角逐:从新加载Monolith

如今,笔者须要从仓库中得到 Monolith 项目的最新版本,而且刷新 Gradle 模块,这样, IDEA 能看到全部的新类。

IntelliJ IDEA 内存优化最佳实践 技术分享 第8张

重要提示:表明默认设置的灰色条形柱很是高,由于 IDEA 在刷新过程当中崩溃了,笔者没法测量实际时间。显然,默认分配的内存不足以执行该操做。

但从三个自定义例子中能够发现,大内存配置花费的时间是最短的。因此,内存分配仍是起到了做用。

最后一次使用jstat-gcutil

由于 IDEA 在默认设置下没法刷新项目,因此,此次测试默认设置就不包括在里面。

IntelliJ IDEA 内存优化最佳实践 技术分享 第9张

IntelliJ IDEA 内存优化最佳实践 技术分享 第10张

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

总结

在此次简短的实验中,你们能够发现,即便对 IntelliJ IDEA 内存进行微调,均可以大大提高 IDE 性能。固然,内存分配越多,执行效果就越好。可是,你也会发现, IDE 以外许多其余应用程序也须要消耗内存,因此,你们的目标应该是在提升性能和内存消耗之间找到一个平衡。笔者认为,在大多数状况下,把 Xmx 值设置在 2G 和 3G 之间是最佳的。若是你有更多的时间能够用 jstat 和 jvisualm 检查用不一样的 JVM 设置如何影响性能和内存占用。

讨论

你的 idea.vmoptions 是如何配置的呢?你还有其它提升 InteliJ IDEA 性能的方法吗?不妨一块儿讨论讨论吧。

(编译自:https://dzone.com/articles/the-one-and-only-reason-to-customize-intellij-idea)

OneAPM 为您提供端到端的 Java 应用性能解决方案,咱们支持全部常见的 Java 框架及应用服务器,助您快速发现系统瓶颈,定位异常根本缘由。分钟级部署,即刻体验,Java 监控历来没有如此简单。想阅读更多技术文章,请访问 OneAPM 官方技术博客