1. 程式人生 > >[jvm]六 jvm調優從 eclipse開始

[jvm]六 jvm調優從 eclipse開始

概述
什麼是jvm調優呢?jvm調優就是根據gc日誌分析jvm記憶體分配、回收的情況來調整各區域記憶體比例或者gc回收的策略;更深一層就是根據dump出來的記憶體結構和執行緒棧來分析程式碼中不合理的地方給予改進。eclipse優化主要涉及的是前者,通過gc日誌來分析。本文主要是通過分析eclipse gc日誌為例來示例如何根據gc日誌來分析jvm記憶體而進行調優,像根據關閉eclipse啟動項、關閉各種校驗等措施來優化eclipse本文不再闡述,網上有很多,本次測試的eclipse已經進行了配置上面的優化。

準備環境
eclipse版本:Release 4.5.0
eclipse 預設配置:eclipse.ini

-startup
plugins/org.eclipse.equinox.launcher_1.3.100.v20150511-1540.jar
–launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.300.v20150602-1417
-product
org.eclipse.epp.package.jee.product
–launcher.defaultAction
openFile
–launcher.XXMaxPermSize
256M
-showsplash
org.eclipse.platform
–launcher.XXMaxPermSize
256m
–launcher.defaultAction
openFile
–launcher.appendVmargs
-vmargs
-Dosgi.requiredJavaVersion=1.7
-Xms256m
-Xmx1024m

在配置的末尾處新增如下配置檔案:
-XX:+PrintGCDetails // 輸出GC的詳細日誌
-XX:+PrintGCDateStamps // 輸出GC的時間戳(以日期的形式)
-Xloggc:gc.log // 輸出GC的詳細日誌
eclipse啟動計時外掛:
http://www.chendd.cn/information/viewInformation/experienceShare/148.a
GChisto.jar:gc日誌分析工具jar包一個

Visual GC: java自帶的記憶體監控工具,通過visual gc可以實時的監控到各個記憶體區域的變化。

如何分析GC日誌
摘錄GC日誌一部分(藍色為年輕代gc回收;綠色為full gc回收):
2016-07-05T10:43:18.093+0800: 25.395: [GC [PSYoungGen: 274931K->10738K(274944K)] 371093K->147186K(450048K), 0.0668480 secs] [Times: user=0.17 sys=0.08, real=0.07 secs]
2016-07-05T10:43:18.160+0800: 25.462: [Full GC [PSYoungGen: 10738K->0K(274944K)] [ParOldGen: 136447K->140379K(302592K)] 147186K->140379K(577536K) [PSPermGen: 85411K->85376K(171008K)], 0.6763541 secs] [Times: user=1.75 sys=0.02, real=0.68 secs]

通過上面日誌分析得出,PSYoungGen、ParOldGen、PSPermGen屬於Parallel收集器。其中PSYoungGen表示gc回收前後年輕代的記憶體變化;ParOldGen表示gc回收前後老年代的記憶體變化;PSPermGen表示gc回收前後永久區的記憶體變化。young gc 主要是針對年輕代進行記憶體回收比較頻繁,耗時短;full gc 會對整個堆記憶體進行回城,耗時長,因此一般儘量減少full gc的次數

通過兩張圖非常明顯看出gc日誌構成:
young gc 日誌

Full GC日誌

啟動調優
啟動eclipse檢視預設配置下啟動時間大概是22秒。

根據GChisto分析gc日誌看出來,啟動過程中進行了一次full gc,19次minor gc;full gc和young gc的時間差不多都是0.65秒左右。

第一步優化:
為了避免記憶體頻繁的動態擴充套件,直接把-Xms配置和-Xmx一致,修改如下:
-Xms1024m

修改完畢,重新啟動:

啟動時間縮小到17秒,分析gc日誌得出young gc22次,full gc沒有了! 但是young gc增加了兩次。
第二步優化:
因為本機的記憶體8G,給eclipse分配1g還是有點小了,簡單粗暴直接所有記憶體配置加倍。
配置如下:
–launcher.XXMaxPermSize
512M
–launcher.XXMaxPermSize
512m
-Xms2048m
-Xmx2048m

啟動時間縮小到15秒,但是 young gc已經縮短到只有7次,說明因為gc回收導致eclipse 啟動慢的問題已經初步解決

第三步優化:

通過Visual GC看到在eclipse啟動的時候classloader載入class的時間有一些,關閉位元組碼可能會優化一部分啟動時間,加入如下引數:
-Xverify:none(關閉Java位元組碼驗證,從而加快了類裝入的速度)
重新啟動測試,啟動時間已經優化到了9秒!

檢視啟動日誌,young gc 的次數僅僅只有了一次!

至此優化結束,附最終的eclipse.ini檔案

-startup
plugins/org.eclipse.equinox.launcher_1.3.100.v20150511-1540.jar
–launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.300.v20150602-1417
-product
org.eclipse.epp.package.jee.product
–launcher.defaultAction
openFile
–launcher.XXMaxPermSize
512M
-showsplash
org.eclipse.platform
–launcher.XXMaxPermSize
512m
–launcher.defaultAction
openFile
–launcher.appendVmargs
-vmargs
-Dosgi.requiredJavaVersion=1.7
-Xms2048m
-Xmx2048m
-Xverify:none
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:gc.log