[IntelliJ IDEA]一打开IntelliJ IDEA,电脑卡的要死,该如何优化内存呢?


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

[IntelliJ IDEA]一打开IntelliJ IDEA,电脑卡的要死,该如何优化内存呢?
本文插图

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 8 和 Groovy ) , 303个Gradle模块
两个微服务——约有10000——20000行代码( Java 8 和 Groovy )的小项目 , 各有一个Gradle模块
测试场景

  • 在 Idea 中关闭所有项目
  • 基于测试文件 idea.vmoptions 进行设置
  • 重启电脑
  • 启动后关闭所有不相关的项目( communicators 等等)
  • 打开 Idea(测试时间)
  • 打开大项目(测试时间)
  • 检查 jstat -gcutil
  • 打开两个微服务项目(测试时间)
  • 检查 jstat -gcutil
  • 返回大项目然后点击“刷新 Gradle 项目”按钮(测试时间)
  • 检查 jstat -gcutil
jstat -gcutil jstat 是 JDK 自带的工具 , 主要利用 JVM 内建的指令对 Java 应用程序的资源和性能进行实时的命令行监控 , 还包括对 Heap size 和垃圾回收状况的监控 。
jstat 完整的文档:
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html
它有许多选项来收集各种数据 , 但这里只会用到:-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. 这个命令的输出结果如下:
S0S1EOMCCSYGC YGCT FGCFGCTGCT89.70 0.00 81.26 74.27 95.68 91.76 40 2.444 140.7153.159 在本文中 , 最重要的参数是 GC 事件( YGC 和 FGC )次数和收集时间( YGCT 和 FGCT ) 。


推荐阅读