首页 > 开发技术 > Eclipse性能优化实践

Eclipse性能优化实践

2013年11月29日 Terence 196 次阅读 发表评论 阅读评论

      这几天毕设开题搞定,空下来看了《深入理解Java虚拟机——JVM高级特性与最佳实践》一书,收益良多,平时经常用Java,但其最本质的运行原理却一直是一知半解,比如堆与非堆内存、新生代年老代与永久代的垃圾回收处理机制、class文件的内部结构等等都是我所感兴趣的内容。

      说到Java性能优化实践,这本书里也就理所当然的提到了Eclipse的优化,之前我也清楚只要修改eclipse.ini文件里的相关配置选项后,打开速度和运行效率会有很大的提高,网上也有很多类似的优化建议,但都不是很全面,或者没有解释清楚。通过阅读本书后,我总算对每个配置选项都有了深入的认识,并最终整理了一份适合大多数情况下的Eclipse性能优化配置清单。当然应用以后效果也是非常显著的,特别是Eclipse冷启动时不会再界面假死了,全程都有比较良好的用户体验和性能表现。因为我的eclipse里加载了不少插件,其中也包含了像MyEclipse这样的大型插件,所以通过优化后启动时间有了明显的缩短。

      下面就贴出我参考本书后整理出来的eclipse.ini文件配置清单:

--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.2.R36x_v20101222
-showsplash
org.eclipse.platform
--launcher.defaultAction
openFile
-product
org.eclipse.epp.package.java.product
--launcher.defaultAction
openFile
-startup
plugins/org.eclipse.equinox.launcher_1.1.1.R36x_v20101122_1400.jar
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms768m
-Xmx768m
-XX:PermSize=384m
-XX:MaxPermSize=384m
-Xmn128m
-Xverify:none
-Xnoclassgc
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=85
-XX:ReservedCodeCacheSize=64m
-Duser.timezone=GMT+08

      然后对上面的配置选项做个解释:

关于被删掉的--launcher.XXMaxPermSize

在初始配置文件中,会有两处该选项,对应的值是256M,其实这和下面的-XX:MaxPermSize是一个意思,都是定义了永久代的最大容量,所以我们可以把自带的那两行删掉。之所以Eclipse这么写是因为考虑到了非Sun公司的的虚拟机,当launcher——Windows下的可执行程序eclipse.exe检测到是Eclipse运行在Sun公司的虚拟机上的话,就会把参数值转化为-XX:MaxPermSize传递给虚拟机进程,因为三大商用虚拟机中只有Sun系列的虚拟机才有永久代的概念,即只有HotSpot虚拟机需要设置这个参数,JRockit虚拟机和IBM J9虚拟机都不需要设置。

-Xms与-Xmx

Xms是初始堆大小,Xmx是最大堆大小。JVM中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。Xms与Xmx设置为一样以避免内存自动扩展和每次垃圾回收完成后JVM重新分配内存。至于到底分配多少,一般是物理内存的1/4,我的建议是768m基本足够,当然前提是系统有足够的内存。另外需要注意的是Xmx包括了年轻代年老代与永久代,JVM内部管理的非堆内存不算,而且一旦把参数都固定死了的话,虚拟机启动了以后会把设定的内存全部划为私有,别的进程用不了。

-XX:PermSize与-XX:MaxPermSize

刚才提到过,一个是永久代的初始值,一个是永久代的最大值。还是和堆设置一样,初始值和最大值设置为一样,避免内存自动扩展和重新分配。设置为384m较为合适,这是MyEclipse给出的建议值。

-Xmn

新生代的内存值,默认值非常小,运行Eclipse这种大程序经常会以为内存不足而发生频繁的GC,所以把它设为128m。

-Xverify

在进行类加载的时候,字节码验证部分的耗时非常严重,考虑到实际情况:Eclipse使用者甚多,它的编译代码我们认为是可靠的,不需要在加载的时候再进行字节码验证,因此通过此参数禁止字节码验证过程也可作为一项优化措施。

-Xnoclassgc

作用是禁用类垃圾回收,缺省情况下,当一个类没有任何活动实例时,JVM就会从内存中卸装该类,但是这样会使性能下降。如果关闭类垃圾回收,就可以消除由于多次装入和卸装同一个类而造成的开销。

-XX:+UseParNewGC与-XX:+UseConcMarkSweepGC

Eclipse算是与使用者交互非常频繁的应用程序,由于代码太多,在做全量编译或清理动作的时候,使用后台处理功能一边编译一边继续做其他的工作。适用于这种场景的当然非CMS垃圾收集器莫属了,所以采用了XX:+UseConcMarkSweepGC参数。至于XX:+UseParNewGC参数,其实ParNew收集器是使用CMS收集器后默认的新生代收集器,写上仅是为了看起来更清晰,CMS是用来收集年老代的。

-XX:CMSInitiatingOccupancyFraction

CMS默认年老代使用了68%就进行收集,所以Full GC次数还是会比较频繁,使用该参数将GC临界值提升到85%,这样收集器的效率就高许多了。

-XX:ReservedCodeCacheSize

设置代码缓存的最大值,这个是JIT即时编译器的配置选项,64m是MyEclipse的推荐值。

-Duser.timezone

这个配置是可选的,非性能选项,主要发现在我的xp系统下JVM里面的时区是+00,而不是+08,win7下正常,所以需要手工的指定下,如果没有这个情况出现的话可以忽略。





 » 转载请注明来源:Terence的窝 » 《Eclipse性能优化实践》
  1. 本文目前尚无任何评论.