在將工做電腦的操做系統更換爲win7以後,個人MyEclipse的啓動速度和運行速率一直很不理想。特別是在同時修改調試多個頁面模板的時候,來回切換兩個文件老是會卡個十來秒。試過關掉各類插件和驗證也無濟於事。因而在大體的研究完JVM後,決定從JVM的角度來試着解決這個問題。 html
首先來看下個人myeclipse.ini裏面的默認啓動參數: java
-Xmx512m :設置堆內存最大值爲512M -XX:MaxPermSize=256m :設置持久代最大值爲256m -XX:ReservedCodeCacheSize=64m :設置代碼佔用的內存大小爲64m
從啓動參數上看不出什麼,因而往裏面加入打印內存變化相關參數: sql
-XX:+PrintGCTimeStamps : 打印每次GC的時間戳 -XX:+PrintGCDetails : 打印每次GC的詳細信息 -Xloggc:myEclipseGC.log :將GC的記錄輸出到文件 -verbose:gc : 輸出每次GC的相關狀況
而後啓動MyEclipse,而後查看myEclipseGC.log裏面的信息: eclipse
啓動耗時大概在30秒左右,選擇性的截取一小部分日誌,能夠看到,在myeclipse啓動的前10秒內,JVM總共執行了300屢次的GC和9次的FULL GC。 jvm
從GC頻率和信息能夠看出內存的回收率很高,且大小在不斷調整,這應該是因爲年輕代的空間不足致使,須要設定一個不小的初始值。 工具
而後來重點關注FULL GC: 測試
5.961: [Full GC 5.961: [Tenured: 34568K->34456K(49676K), 0.1397651 secs] 35336K->34456K(53452K), [Perm : 26623K->26458K(26624K)], 0.1398562 secs] [Times: user=0.14 sys=0.00, real=0.14 secs]
9.030: [Full GC 9.030: [Tenured: 53310K->52332K(64588K), 0.2034757 secs] 56020K->52332K(69516K), [Perm : 43007K->42996K(43008K)], 0.2036030 secs] [Times: user=0.20 sys=0.00, real=0.20 secs]
從兩第二天志的對比中能夠看到,FULL GC主要是在回收Tenured和Perm這兩個區域,而且這兩個區域的大小都在不斷的調整中,因此決定先把它們的大小固定下來。 優化
因而調整後的參數以下:
spa
-Xmx512m -Xms512m :設定堆的最小值爲512m -Xmn192m : 設定年輕代的大小爲192m -XX:PermSize=192m : 設定持久代的初始值爲192m -XX:MaxPermSize=192m -XX:ReservedCodeCacheSize=64m -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:myEclipseGC.log -verbose:gc
從新啓動一次MyEclipse,查看日誌信息: 操作系統
啓動耗時12秒左右,從日誌能夠看出,在前10秒內總共只進行了5次GC,不涉及各區域大小的調整,這個結果仍是能夠接受的,由於工做時不怎麼須要頻繁重啓。
接下來研究困擾了我好久的來回切換html文件時的常常性延時和大卡問題,爲了更直觀的研究JVM的內存變化,決定藉助jconsole這個java自帶的輔助工具。先把myeclipse.ini的參數還原,避免被第一階段的優化干擾。
啓動myeclipse,啓動jconsole並接入myeclipse所在的JVM,穩定後的整個堆的內存圖以下:
接下來試着打開幾個模板,而後觀察內存的變化。
首先是堆內存的總體使用狀況:
能夠看到,在打開了幾個模板以後,堆內存的使用從原先的100M如下突增至300M以上。使用量增長了三倍,可是還在我設置的512M範圍以內。因此能夠暫時不考慮繼續增長堆內存,轉而考慮調整各區內存大小比例問題。
因而觀察下各個區在這段時間的內存使用狀況,其中,Eden區以下:
Eden區在這段時間的內存使用率大增,且發生了屢次GC。經過底下的監控信息能夠知道,eden區在默認狀況下只分配了31M的最大內存,這顯然是不夠用的。稍微執行點操做都會觸發eden區的GC,這應該是模板打開切換髮生延時卡頓的緣由之一,須要調整。
接下來是Tenured區:
JVM默認給這個區域分配的最大空間是470M。隨着內存使用的變化,這個區域的實際大小一直在調整,每次區域大小的調整都會發生FULL GC,這應該是常常性大卡的緣由之一。而新模板的打開是觸發這種調整的主要緣由。從這個區域內存的使用上來看,將這個區域的內存空間維持並固定在450M左右,保持必定的冗餘仍是有必要的。
從這點來看,jvm的堆內存仍是有必要稍微擴充下以維持一個較大的Tenured區和Eden區。
最後來看下perm區:
做爲方法區的一部分,這個區域的內存變化並不大,而且比較穩定,原本不須要留太多的冗餘。可是考慮到當前打開的工程實際代碼量並不大,決定暫時維持在128M左右,往後慢慢調整。
因而根據上面的分析將參數調整爲:
-Xmx768m -Xms768m -Xmn256m -XX:PermSize=192m -XX:MaxPermSize=192m -XX:ReservedCodeCacheSize=64m重啓myeclipse,接入Jconsole,同時打開三十來個模板作了下測試。在觀查各個區的內存使用率時發現一個問題,在將年輕代調整爲256M之後,因爲Eden再也不頻繁的發生GC,進入 Tenured區的數據量明顯減小 ,Tenured區的內存使用圖以下:
如上圖,在特地打開不少模板的狀況下,450M+的空間只使用了不到250M,空間利用率過低,需再作調整。
以上是我對本身的myeclipse進行調優的一些思路和實際調優的過程,在實際使用中又根據本身的喜愛進行了一些調整定製,最終造成的myeclipse.ini的參數以下:
-vmargs -Xmx512m -Xms512m -Xmn192m -XX:PermSize=128m -XX:MaxPermSize=128m -XX:ReservedCodeCacheSize=64m在這個參數設置下,myeclipse的響應速度比較有保證,各類延時卡頓的現象的出現頻率大大下降。缺點是常駐的佔用的系統內存偏高,喜歡同時打開多個myeclipse的同窗可根據本身的須要和實際狀況進行適當的調整。