不知道大家是不是跟我一樣,打開Eclipse都是龜速,每次點擊打開后,我都會跑出去倒杯水再回來。那么有沒有什么辦法可以加快啟動速度呢?我的思路主要有以下幾個:
- 卸載不會再用或不常用的一堆插件。
- 別把所有的項目都放在一個workspace里面,可以多建幾個workspace。比如最近一段時間要著手的一個或幾個項目放在一個workspace里。
- 通過修改Eclipse的配置文件(
eclipse.ini)來加快Eclipse的啟動速度。
前面兩個相信大部分人都能想到,做起來也很簡單,本文主要介紹第三種方式,即通過修改配置文件來加速。
我的環(huán)境:
Eclipse版本:Eclipse LUNA
JDK版本:jdk 1.8.0
本機內存:6G
首先需要在eclipse.ini里面添加-Xloggc:gc.log配置來查看啟動的日志,然后通過分析日志來調優(yōu)參數。
我原先的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]
可以發(fā)現Full GC的次數為3次,minior GC的次數為15次。
進一步分析發(fā)現:
- 觸發(fā)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 并不表示有什么代碼發(fā)生了錯誤,而只是無法從堆中分配足夠的空間。這也能理解,上面Eclipse的默認配置中Xms(初始化堆大?。┲挥?0m,-Xmx(最大堆大?。┲挥?56m,這里加大這兩個參數的配置即可。
經過上述分析,我修改的配置參數如下:
-Xms512m
-Xmx1024m
-XX:MetaspaceSize=128M
-verbose:gc
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-Xloggc:gc.log
此時重啟Eclipse后發(fā)現速度稍快了點,打印日志如下:
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]
發(fā)現Full GC消失了,最后剩下2次Minor GC。不過這2次AF問題我是調不掉了,不管修改什么參數,最終還是會出現這2次GC,相比之前已經很好了,就到此為止吧。如果您有更好的設置方法(比如能夠消除最后的兩次GC),或者糾正文中錯誤的方法,請留言告知。