AppCode JVM 参数优化

昨晚花了 2 个小时熟悉了一下 AppCode, 和 IDEA 系列给人的感觉一样:很卡很强大。就打算优化一下 JVM 的设置,AppCode 的 JVM 参数配置文件在 /Applications/AppCode EAP.app/bin/idea.vmoptions

使用默认的参数,用一段 AppCode,观察了一下 GC 的情况:

➜  ~  jstat -gcutil 50991 1s
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
 79.31   0.00  37.61  88.64  60.84   6654   57.031   137    3.017   60.048
 79.31   0.00  37.63  88.64  60.84   6654   57.031   137    3.017   60.048
 79.31   0.00  37.65  88.64  60.84   6654   57.031   137    3.017   60.048
 79.31   0.00  37.66  88.64  60.84   6654   57.031   137    3.017   60.048
 79.31   0.00  37.67  88.64  60.84   6654   57.031   137    3.017   60.048
 79.31   0.00  37.69  88.64  60.84   6654   57.031   137    3.017   60.048
 79.31   0.00  37.70  88.64  60.84   6654   57.031   137    3.017   60.048

发现 YoungGC 有 6654 次,耗时 57s,FullGC 有 137 次,3s 多,花在 GC 上的总时间有 60s,按每次卡一次 1s 来算,单是 GC 就让人感觉到 60 次明显卡顿,确实让人受不了。

查了一下默认的参数,内存设置的太保守,所以我改成了下面这个方案:
我的机子是 8G 内存,给 AppCode 分配 1500M,如果你的是 4G 内存,建议把 -Xms1500m-Xmx1500m 都调成 1000m,-XX:NewSize=600m-XX:MaxNewSize=600m 改为 400M。修改之前把 idea.vmoptions 文件备份一下,以防万一。

-Xms1500m
-Xmx1500m
-XX:NewSize=600m  
-XX:MaxNewSize=600m
-XX:SurvivorRatio=8
-XX:PermSize=200m
-XX:MaxPermSize=400m
-XX:ReservedCodeCacheSize=96m
-XX:+UseCompressedOops
-XX:+DisableExplicitGC

使用后:

➜  jstat -gcutil 58835 1s

  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
 61.70   0.00  48.84  15.60  52.92     12    1.066     0    0.000    1.066
 61.70   0.00  48.84  15.60  52.92     12    1.066     0    0.000    1.066
 61.70   0.00  48.84  15.60  52.92     12    1.066     0    0.000    1.066
 61.70   0.00  48.84  15.60  52.92     12    1.066     0    0.000    1.066
 61.70   0.00  48.84  15.60  52.92     12    1.066     0    0.000    1.066
 61.70   0.00  48.84  15.60  52.92     12    1.066     0    0.000    1.066

YGC 降低到了 12 次,GC 时间是 1s,没有 FullGC, 没有感觉到卡顿的情况。

这个主要是从内存分配方面优化,GC 算法上也可以优化,但是需要多测试每种 GC 算法的情况,也可能会因人而异,等我慢慢找到一个不错的方案再分享出来。

至于上面参数的意思,可以查看我在 iteye 上以前的一篇 Blog:10s 启动 MyEclipse/Eclipse 的 JVM 参数(含 Mac 下)