最近,Eclipse(Eclipse-JEE3.5)运行十分缓慢(可能插件安装过多),因此,得到了个机会调优一下,以便提高工作效率
下图是未经任何调整eclipse的gc情况(使用jvisualvm命令,安装visual gc插件)在终端输入:jvisualvm运行后,工具->插件->visual gc,安装。
启动eclipse后,在终端运行: ps -ef | grep eclipse,然后在jvisualvm的应用程序一栏选择eclipse pid的程序双击,即可到visual gc上查看图表。
-Xms1024m
-Xmx1024m对应的为图中的 Old 区;
-XX:NewSize=768m
-XX:MaxNewSize=768m对应的为图中的 Eden 区;
-XX:PermSize=200m
-XX:MaxPermSize=200m对应的为图中的 Perm区;
从图中可以看出,仅启动过程就有38次young gc,11次full gc 为了查看gc细节,在eclipse.ini中加入如下参数: -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:D:/soft/eclipse-jee/gc.log gc的内容如下: 从gc日志中可以看出: (1)young区开始为4928K,持续的不够,因此造成不断的young gc (2)full gc时,old区的空间增大扩容,因此old区空间也不够 为了防止这种情况发生,加入以下参数: -Xms768m -Xmx768m -XX:NewSize=512m -XX:MaxNewSize=512m 此次调整后结果如下图: 从图中可以看出,young gc没有了,但为啥还11次full gc呢? 以下是此次gc的日志: 从gc.log中,可以看出,是因为perm区的没有空间了,才导致的full gc,于是将perm区增大并固定大小 加入以下参数: -XX:PermSize=96m -XX:MaxPermSize=96m 此次调整后结果如下: 可以看出,没有full gc了,而且young gc只有一次,有了一定的效果了 启动时gc的问题解决了,现在来看其他问题: 从图中可以看出,如果classloader加载class的时间能快些,应该也会节省些时间 加入以下参数: -Xverify:none(关闭字节码验证,从而加快了类装入的速度) 将上两图比较 第一个:平均每个类的载入时间为,54.615/10950 = 0.0049876712328767s 第二个:平均每个类的载入时间为,34.498/9484 = 0.0036374947279629s 可以看出,多少是有一些性能上的提高的 考虑到eclipse长时间运行,其他可能调节的有以下几点: (1)关闭System.gc() (2)提高eclipse中某些代码的JIT编译 (3)优化垃圾收集器,以减少垃圾收集造成应用无响应的时间 对于(1),加入以下参数: -XX:+DisableExplicitGC 对于(2),会影响启动速度,但由于eclipse是长时间运行,因此此优化是必要的: -XX:CompileThreshold=100(方法调用多少次就会被编译成本地机器码) 可以看出,编译方法的数量和时间明显增加 对于(3),换用CMS收集器应该比串行收集器要好,加入以下参数: -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80 至此,调优结束
总结一下加入的参数如下:
-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:D:/soft/eclipse-jee-galileo-win32/eclipse/gc.log-Xms512m -Xmx512m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=96m -XX:MaxPermSize=96m -XX:+DisableExplicitGC -XX:CompileThreshold=100 -Xverify:none -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80参考如上内容用的eclipse.ini:
1、小内存,运行情况不错
-clean
-startupplugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar--launcher.libraryplugins/org.eclipse.equinox.launcher.gtk..x86_1.1.200.v20130807-1835-productorg.eclipse.epp.package.cpp.product--launcher.defaultActionopenFile-showsplashorg.eclipse.platform--launcher.XXMaxPermSize256m--launcher.defaultActionopenFile--launcher.appendVmargs-vmargs-Dosgi.requiredJavaVersion=1.6-Xms512m-Xmx512m-XX:NewSize=256m-XX:MaxNewSize=256m-XX:PermSize=96m-XX:MaxPermSize=96m-XX:+DisableExplicitGC-XX:CompileThreshold=100-Xverify:none-XX:+UseParNewGC-XX:+UseConcMarkSweepGC-XX:CMSInitiatingOccupancyFraction=802、大内存
-clean
-startup plugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar --launcher.library plugins/org.eclipse.equinox.launcher.gtk.linux.x86_1.1.200.v20130807-1835 -product org.eclipse.epp.package.cpp.product --launcher.defaultAction openFile -showsplash org.eclipse.platform --launcher.XXMaxPermSize 256m --launcher.defaultAction openFile --launcher.appendVmargs -vmargs -Dosgi.requiredJavaVersion=1.6 -Xms1600m -Xmx1600m -XX:NewSize=800m -XX:MaxNewSize=800m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DisableExplicitGC -XX:CompileThreshold=100 -Xverify:none -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=803、大内存,自己弄的,可能优化的不合理
-clean -startup plugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar --launcher.library plugins/org.eclipse.equinox.launcher.gtk.linux.x86_1.1.200.v20130807-1835 -product org.eclipse.epp.package.cpp.product --launcher.defaultAction openFile -showsplash org.eclipse.platform --launcher.XXMaxPermSize 256m --launcher.defaultAction openFile --launcher.appendVmargs -vmargs -Dosgi.requiredJavaVersion=1.6 -XX:MaxPermSize=256m -Xms40m -Xmx2048m -Xss1024k -Xss1024k -XX:+DisableExplicitGC -XX:CompileThreshold=100 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80 -Xverify:none