標籤:java eclipse 設定檔 啟動速度
不知道大家是不是跟我一樣,開啟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),或者糾本文中錯誤的方法,請留言告知。
參考資料
- 淺析配置更快的Eclipse方法
- What is the Metadata GC Threshold and how do I tune it?
- 給Eclipse提速的7個技巧
如何加快Eclipse的啟動速度?