## 前言
如果發現自己的IDE很慢,或者卡頓,那么就對它來一次調優吧。本人使用的是IDEA,如果是Eclipse的同學,可查找對應相關資料,本文僅供參考。
## 安裝啟動信息插件
筆者查找資料后,開發了IDEA啟動信息的小插件,地址:https://gitee.com/mgang/idea-plugin-start-time 歡迎下載安裝使用。
## 調優思路
* 選擇IDEA合適的JDK版本,經過多種JDK嘗試,使用默認`openjdk-11.0.6`,筆者IDEA版本信息如下:
```
IntelliJ IDEA 2019.3.5 (Community Edition)
Build #IC-193.7288.26, built on May 6, 2020
Runtime version: 11.0.6+8-b520.66 x86_64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
macOS 10.15.7
GC: G1 Young Generation, G1 Old Generation
Memory: 750M
Cores: 4
Registry:
Non-Bundled Plugins: Lombook Plugin, PlantUML integration, PsiViewer, com.bruce.intellijplugin.generatesetter, com.damoguyansi.all-format, com.idlesign.qrcoder, com.mango.idea.plugin, jclasslib, leetcode-editor, ru.artyushov
```
如下是嘗試過的JDK版本:

* 禁用類加載時的驗證,減少時間 `-Xverify:none`
* 禁用系統調用GC,`-XX:+DisableExplicitGC`
* 可利用VisualVM或者JMC等可視化工具,查看IDEA的GC情況,將GC的停頓(STW)時間盡可能降低。根據自己機器內存,配置合適的JVM內存設置。
`-Xms750m -Xmx750m -Xmn400m -XX:MetaspaceSize=248m -XX:MaxMetaspaceSize=500m`

* 選擇低延時的垃圾收集器,比如`-XX:+UseG1GC`
## 調優后JVM參數
經過調優后,本人IDEA的JVM參數如下:
~~~
-Xms750m
-Xmx750m
-Xmn400m
-XX:MetaspaceSize=248m
-XX:MaxMetaspaceSize=500m
-XX:+PrintGCDetails
-Xloggc://Users/mango/logs/ideagc.log
-verbose:gc
-Xverify:none
-XX:+DisableExplicitGC
-XX:+UnlockCommercialFeatures
-XX:+FlightRecorder
-XX:ReservedCodeCacheSize=240m
-XX:+UseG1GC
-XX:SoftRefLRUPolicyMSPerMB=50
-ea
-XX:CICompilerCount=2
-Dsun.io.useCanonPrefixCache=false
-Djava.net.preferIPv4Stack=true
-Djdk.http.auth.tunneling.disabledSchemes=""
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-Djdk.attach.allowAttachSelf=true
-Dkotlinx.coroutines.debug=off
-Djdk.module.illegalAccess.silent=true
-XX:+UseCompressedOops
-Dfile.encoding=UTF-8
-XX:ErrorFile=$USER_HOME/java_error_in_idea_%p.log
-XX:HeapDumpPath=$USER_HOME/java_error_in_idea.hprof
~~~
插件打印啟動信息如下:

- 面試突擊
- Java虛擬機
- 認識字節碼
- 000Java發展歷史
- 000Macos10.15.7上編譯OpenJDK8u
- 001熟悉Java內存區域
- 002熟悉HotSpot中的對象
- 003Java如何計算對象大小
- 004垃圾判定算法與4大引用
- 005回收堆和方法區中對象
- 006垃圾收集算法
- 007HotSpot虛擬機垃圾算法實現篇1
- 007HotSpot虛擬機垃圾算法實現篇2
- 007HotSpot虛擬機垃圾算法實現篇3
- 008垃圾收集器
- 009內存分配與回收策略
- 010Java虛擬機相關工具
- 011調優案例分析
- 012一次IDEA的啟動速度調優
- 013類文件Class的結構
- 014熟悉字節碼指令
- 015類加載機制(過程)
- 016類加載器
- IDEA的JVM參數
- Java基礎
- Java自動裝箱與拆箱
- Java基礎數據類型
- Java方法的參數傳遞
- Java并發
- 001走入并行的世界
- 002并行程序基礎
- 003熟悉Java內存模型JMM
- 004Java并發之volatile關鍵字
- 005線程池入門到精通
- 006Java多線程間的同步控制方法
- 007Java維基準測試框架JMH
- 008Java并發容器
- 009Java的線程實現
- 010Java關鍵字synchronized
- 011一些并行模式的熟悉
- 單例模式和不變模式
- 生產者消費者模式
- Future模式
- 012一些并行算法的熟悉
- 面試總結
- 長亮一面