Elicpse启动及运行速度调优

来源:互联网 发布:文泰刻绘端口设置 编辑:程序博客网 时间:2024/05/12 01:39

相信很多IT同行会使用Eclipse作为日常工作中的主要IDE工具,由于安装的插件会越来越多,代码也越来越多,启动Eclipse时可能会花掉几十秒钟,Eclipse启动后开始加载并编译所有项目,可能直接就卡住,又得等几十秒甚至几分钟。在修改代码过程中,也可能写着写着又卡住,这些都是我们经常遇到的。不能因为开发工具而影响了我们的工作效率是不?有必要来改善下我们的工作环境了。
在动手之前,先介绍一个工具:VisualVm,该工具在JDK1.6 Update7中首次发布,现在是Sun(Oracle)主力推动的多合一故障处理工具。(点击下载VisualVm,该版本需用64位jdk)下载后直接解压后运行visualvm-ml\visualvm_137\bin\visualvm.exe。打开后界面如下图:这里看到的是VisualVm自动的运行时监控画面。
这里写图片描述
下面还需要安装一个插件VisualGC,打开“工具——插件——可用插件”,在这里勾选VisualGC安装,这里有很多插件,我因为已经安装图中没有显示。
这里写图片描述
安装好后,重启VisualVm后,看到多了一个选项卡VisualGC,这个界面里,可以清楚看到JVM内存分配情况,包含:永久代、老年代、新生代、Surviver的内存情况。
这里写图片描述

安装以上工具后我们可以监控任何运行在jvm虚拟机上的程序运行情况,收集运行内存变化,为我们的内存优化提供相当有价值的信息。
简单介绍本次会用到的一些图形:
1、虚拟机堆大小分配情况;
堆内存分配情况
堆大小变化曲线,黄色区域表示“已配堆大小”,蓝色曲线表示“已使用大小“,蓝色曲线为什么成锯齿状?因为这里执行了GC垃圾回收操作,
2、虚拟机永久代分配情况;永久代又叫非堆内存,是提供给开发人员用的,其中主要存放类方法及常量。
这里写图片描述
这是永久代内存分配情况,这里的曲线与堆内存曲线长相完全不同,因为他们存放的内容不同。永久代包含方法区,常量池等,这些内容是不会被回收的,所以使用曲线会呈水平或上升趋势。而堆主要用于存放各种类的实例对象,实例对象失去引用后就容易被回收,所以使用曲线呈锯齿状。
3、VisualGc内在增涨及垃圾回收情况;
这里写图片描述

最左边是”永久代(Perm),老年代(Old)、新生代(Eden)、s0、s1。同时记录启动到现在GC次数及耗时。

简单说明就到这里,讲得很糙。。。。。

我本机jdk版本:
这里写图片描述

我用于Android开发的Eclipse为eclipse-java-luna-SR1a-win32-x86_64。它eclipse.ini文件默认配制如下:

-startup
plugins/org.eclipse.equinox.launcher_1.3.0.v20140415-2008.jar
–launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.200.v20140603-1326
-product
org.eclipse.epp.package.java.product
–launcher.defaultAction
openFile
–launcher.XXMaxPermSize
256M
-showsplash
org.eclipse.platform
–launcher.XXMaxPermSize
256m
–launcher.defaultAction
openFile
–launcher.appendVmargs
-vmargs
-Dosgi.requiredJavaVersion=1.6
-Xms40m
-Xmx512m

把VisualVm打开后,执行Eclipse,可以看到VisualVm概述中看到JVM参数:

-Dosgi.requiredJavaVersion=1.6
-Xms40m
-Xmx512m
-XX:MaxPermSize=256m

-Xms40m指堆最小值为40M;
-Xmx512m指堆最大值为512M;
-XX:MaxPermsize=256m指永久代最大值为256M。
-XX:MaxPermSize这个参数在eclipse.ine中并没有配置,但有

–launcher.XXMaxPermSize
256M
-showsplash
org.eclipse.platform
–launcher.XXMaxPermSize
256m
–launcher.defaultAction

我也不知道哪个参数被传递给JVM作为-XX:MaxPermSize了。但经验证是第二个参数被传到JVM。这样的默认配置,程序还是正常启动了,为了彻底搞清楚这几个参数,我决定修改这几个值,让Eclipse启动不了,直接卡爆。
我改了这三个被作为JVM参数的数值,修改后配置如下:

-vmargs
-Dosgi.requiredJavaVersion=1.6
-Xms40m
-Xmx512m
-XX:MaxPermSize=60m

这里直接配置了永久代最大60m,这个参数覆盖
-launcher.XXMaxPermSize的配置。这样的配置成功的导致Eclipse启动失败了。下面两张图可以看出问题出在哪里。
这里写图片描述
这里写图片描述
永久代最大内存分配了只有60M,启动瞬间永久代空间就被撑满了,当jvm发现永久代不够时会进行FULL GC操作,也会进行扩容,但已经达到最大限制,扩容无法实现,只有不断尝试GC操作,但永久代存储方法或常量没有可回收空间。如此eclipse自然启动不了。
同样也可以尝试-Xmx(最大堆内存),会得到相同的。

结论一:我们需要为Eclipse分配足够大的永久代内存空间和足够大的堆内存。

-Xmx512m ##最大堆的大小
-XX:MaxPermSize=512m ##最大永久代大小
根据自身机器环境合理分配。

Eclipse启动时我们分配的最小堆为40m,这个大小明显是不够用的,Eclipse启动时,当发现40m快不够用了,马上触发一次minor GC,但没有腾出多少空间,必须进行一次扩容。扩容后空间变大,但很快又不够用了,又进行GC和扩容,反复多次。扩容到是不会很耗时,而在GC过程中程序其他线程简单说是处于等待状态,这样就把时间白白浪费在无用功上面,为了避免这个问题,我们把初始时分配的最小堆设置的大一些,甚至于最大堆一致呢。这样就不会GC浪费时间了。

结论二:堆和永久代最大最小值都设为相同值,避免GC和扩容浪费时间。

-vmargs
-Dosgi.requiredJavaVersion=1.6
-Xms512m
-Xmx512m
-XX:PermSize=512m
-XX:MaxPermSize=512m

这样配置后Eclipse启动内存情况
这里写图片描述
堆大小直接就定格在512m左右了。

按这样以上基本原则,可以解决Eclipse卡爆的情况,但还有一些参数,也是影响运行性能的。比如新生代大小,这是从堆里分配出来的一块区域。
堆=老年代(Old)+新生代(Ened+s0+s1);
新生代内存不足时,会触发Minor gc,经常发生但效率也较高,但如果能减少gc次数总是好的,在Eclipse.ini中通过-Xmn400m设置新生代大小。

-vmargs
-Dosgi.requiredJavaVersion=1.6
-Xms1024m
-Xmx1024m
-Xmn400m
-XX:PermSize=512m
-XX:MaxPermSize=512m

在Eclipse启动过程中除了GC耗时外还存在JIT编译及类加载耗时,而实际情况是,Eclipse被众中开发都使用,它的编译代码可以认为是可靠的,不需要在加载的时候再进行字节码验证,因此可以通过参数-Xverify:none禁止字节码验证过程。
另一个参数:-XX:+DisableExplicitGC屏蔽System.gc()操作。
最终eclipse.iniJVM参数配置如下:

-vmargs
-Dosgi.requiredJavaVersion=1.6
-Xms2048m
-Xmx2048m
-Xmn512m
-XX:PermSize=1024m
-XX:MaxPermSize=1024m
-XX:+DisableExplicitGC
-Xverify:none

-Xms2048m ##堆内存最小分配2048 启动时即分配到最大内存
-Xmx2048m ##堆内存了大分配2048
-Xmn512m ##新生代内存分配512M(Ened+s0+s1)这三者大小会变化
-XX:PermSize=1024m ##分配永久代(方法区,常量池)最小内存2014m
-XX:MaxPermSize=1024m ##永久代最大内存1024
-XX:+DisableExplicitGC ##屏蔽代码中的system.gc()引发的GC动作
-Xverify:none ##禁用字节码验证。

我使用的是8G内在笔记本,这样的配置Eclipse能成功启动,我相信这样的配置开发一般的程序都不会怎么卡。这个配置是我随手配置的,只要知道了上面的原则,应该就能解决Eclipse开发时卡顿的现象了。

总结: 保证永久代和堆有一个比较大内存空间,并且尽量将最小值往最大值上靠,避免GC和扩容带来的时间浪费。

比如Tomcat启动或运行的时候有时报PermOutOffMemery类似这样的错误(随手写的哈。。)。如果遇到了可以用VisualVm工具监控,就很容易找到报错的原因了。
0 0
原创粉丝点击