不知道大家是不是跟我一样,打开Eclipse都是龟速,每次点击打开后,我都会跑出去倒杯水再回来。那么有没有什么办法可以加快启动速度呢?我的思路主要有以下几个:
- 卸载不会再用或不常用的一堆插件。
- 别把所有的项目都放在一个workspace里面,可以多建几个workspace。比如最近一段时间要着手的一个或几个项目放在一个workspace里。
- 通过修改Eclipse的配置文件(
eclipse.ini
)来加快Eclipse的启动速度。
前面两个相信大部分人都能想到,做起来也很简单,本文主要介绍第三种方式,即通过修改配置文件来加速。
我的环境:
Eclipse版本:Eclipse LUNA
JDK版本:jdk 1.8.0
本机内存:6G
首先需要在eclipse.ini
里面添加-Xloggc:gc.log
配置来查看启动的日志,然后通过分析日志来调优参数。
我原先的vmargs参数配置如下(后面添加了几个打印日志选项)
-Xms40m
-Xmx256m
-verbose:gc
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-Xloggc:gc.log
启动Eclipse成功后,配置目录下会多处一个gc.log的日志文件,内容如下:
2014-12-01T17:17:24.102+0800: 1.011: [GC (Allocation Failure) [PSYoungGen: 10240K->1528K(11776K)] 10240K->2573K(39424K), 0.0357842 secs] [Times: user=0.00 sys=0.00, real=0.04 secs]
2014-12-01T17:17:24.695+0800: 1.604: [GC (Allocation Failure) [PSYoungGen: 11768K->1528K(11776K)] 12813K->6418K(39424K), 0.0163152 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]
2014-12-01T17:17:24.933+0800: 1.843: [GC (Allocation Failure) [PSYoungGen: 11768K->1528K(11776K)] 16658K->10668K(39424K), 0.0209557 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]
2014-12-01T17:17:25.766+0800: 2.676: [GC (Allocation Failure) [PSYoungGen: 11768K->1528K(22016K)] 20908K->12994K(49664K), 0.0152186 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
2014-12-01T17:17:27.385+0800: 4.294: [GC (Allocation Failure) [PSYoungGen: 22008K->1521K(22016K)] 33474K->19971K(49664K), 0.0243423 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]
2014-12-01T17:17:28.515+0800: 5.424: [GC (Metadata GC Threshold) [PSYoungGen: 14910K->6286K(50176K)] 33360K->24736K(77824K), 0.0408780 secs] [Times: user=0.09 sys=0.00, real=0.04 secs]
2014-12-01T17:17:28.556+0800: 5.466: [Full GC (Metadata GC Threshold) [PSYoungGen: 6286K->0K(50176K)] [ParOldGen: 18450K->21574K(46080K)] 24736K->21574K(96256K), [Metaspace: 19172K->19172K(1069056K)], 0.3825136 secs] [Times: user=0.75 sys=0.00, real=0.38 secs]
2014-12-01T17:17:33.134+0800: 10.044: [GC (Allocation Failure) [PSYoungGen: 40960K->9212K(50176K)] 62534K->34014K(96256K), 0.0848276 secs] [Times: user=0.13 sys=0.00, real=0.09 secs]
2014-12-01T17:17:35.882+0800: 12.792: [GC (Metadata GC Threshold) [PSYoungGen: 37650K->12260K(61952K)] 62451K->41391K(108032K), 0.0443515 secs] [Times: user=0.05 sys=0.00, real=0.04 secs]
2014-12-01T17:17:35.926+0800: 12.837: [Full GC (Metadata GC Threshold) [PSYoungGen: 12260K->0K(61952K)] [ParOldGen: 29131K->31402K(68096K)] 41391K->31402K(130048K), [Metaspace: 32296K->32296K(1079296K)], 0.2952576 secs] [Times: user=0.45 sys=0.00, real=0.30 secs]
2014-12-01T17:17:40.580+0800: 17.490: [GC (Allocation Failure) [PSYoungGen: 49664K->12627K(65536K)] 81066K->44038K(133632K), 0.0400038 secs] [Times: user=0.08 sys=0.00, real=0.04 secs]
2014-12-01T17:17:43.820+0800: 20.730: [GC (Allocation Failure) [PSYoungGen: 62291K->17399K(63488K)] 93702K->51113K(131584K), 0.0402957 secs] [Times: user=0.02 sys=0.02, real=0.04 secs]
2014-12-01T17:17:44.362+0800: 21.271: [GC (Metadata GC Threshold) [PSYoungGen: 25530K->13577K(59904K)] 59244K->47299K(128000K), 0.0291300 secs] [Times: user=0.05 sys=0.00, real=0.03 secs]
2014-12-01T17:17:44.391+0800: 21.301: [Full GC (Metadata GC Threshold) [PSYoungGen: 13577K->0K(59904K)] [ParOldGen: 33721K->39688K(88576K)] 47299K->39688K(148480K), [Metaspace: 53933K->53933K(1099776K)], 0.4561979 secs] [Times: user=0.67 sys=0.02, real=0.46 secs]
2014-12-01T17:17:50.364+0800: 27.274: [GC (Allocation Failure) [PSYoungGen: 46080K->11833K(66048K)] 85768K->51530K(154624K), 0.0260724 secs] [Times: user=0.05 sys=0.00, real=0.03 secs]
2014-12-01T17:17:52.379+0800: 29.289: [GC (Allocation Failure) [PSYoungGen: 56889K->14031K(66048K)] 96586K->53735K(154624K), 0.0301987 secs] [Times: user=0.06 sys=0.00, real=0.03 secs]
2014-12-01T17:17:54.831+0800: 31.742: [GC (Allocation Failure) [PSYoungGen: 59087K->16928K(62976K)] 98791K->56641K(151552K), 0.0651508 secs] [Times: user=0.14 sys=0.00, real=0.07 secs]
2014-12-01T17:18:12.857+0800: 49.768: [GC (Allocation Failure) [PSYoungGen: 58912K->17695K(59904K)] 98625K->57415K(148480K), 0.0486718 secs] [Times: user=0.09 sys=0.00, real=0.05 secs]
可以发现Full GC的次数为3次,minior GC的次数为15次。
进一步分析发现:
- 触发Full GC和部分GC的原因是“Metadata GC Threshold”,没用过java 8的人可能对这个不熟悉,因为Metaspace是java 8的新特性,取代了大家非常熟悉的PermGen,具体了解可以看这篇文章:Java 8新特性探究(九)跟OOM:Permgen说再见吧。
上面的意思是说Metaspace的大小设置的太小了,造成频繁GC,这个可以通过-XX:MetaspaceSize
参数设置。
注意:关于Metaspace的配置不只是-XX:MetaspaceSize
这一个参数,还有其它的,主要有下面这些: -
-XX:InitialBootClassLoaderMetaspaceSize=32M
:to increase the boot class loader Metaspace; -
-XX:MinMetaspaceFreeRatio=50
:to make Metaspaces grow more agressively; -
-XX:MaxMetaspaceFreeRatio=80
:to reduce the chance of Metaspaces shrinking; -
-XX:MinMetaspaceExpansion=4M
:the minumum size by which a Metaspace is exanded; - -
XX:MaxMetaspaceExpansion=16M
:the maximum size to expand a Metaspace by without Full GC. - 大部分的Minor GC都出现了AF(Allocation Failure)错误,AF 并不表示有什么代码发生了错误,而只是无法从堆中分配足够的空间。这也能理解,上面Eclipse的默认配置中Xms(初始化堆大小)只有40m,-Xmx(最大堆大小)只有256m,这里加大这两个参数的配置即可。
经过上述分析,我修改的配置参数如下:
-Xms512m
-Xmx1024m
-XX:MetaspaceSize=128M
-verbose:gc
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-Xloggc:gc.log
此时重启Eclipse后发现速度稍快了点,打印日志如下:
2014-12-01T18:14:11.134+0800: 7.991: [GC (Allocation Failure) [PSYoungGen: 131584K->21493K(153088K)] 131584K->35355K(502784K), 0.1561477 secs] [Times: user=0.30 sys=0.02, real=0.16 secs]
2014-12-01T18:14:18.805+0800: 15.662: [GC (Allocation Failure) [PSYoungGen: 153077K->21494K(284672K)] 166939K->67517K(634368K), 0.1496186 secs] [Times: user=0.16 sys=0.05, real=0.15 secs]
发现Full GC消失了,最后剩下2次Minor GC。不过这2次AF问题我是调不掉了,不管修改什么参数,最终还是会出现这2次GC,相比之前已经很好了,就到此为止吧。如果您有更好的设置方法(比如能够消除最后的两次GC),或者纠正文中错误的方法,请留言告知。
网友评论