Java虛擬機(七):JVM調優案列

Eclispe啓動優化

概述

   什麼是jvm調優呢?jvm調優就是根據gc日誌分析jvm內存分配、回收的狀況來調整各區域內存比例或者gc回收的策略;更深一層就是根據dump出來的內存結構和線程棧來分析代碼中不合理的地方給予改進。eclipse優化主要涉及的是前者,經過gc日誌來分析。本文主要是經過分析eclipse gc日誌爲例來示例如何根據gc日誌來分析jvm內存而進行調優,像根據關閉eclipse啓動項、關閉各類校驗等措施來優化eclipse本文再也不闡述,網上有不少,本次測試的eclipse已經進行了配置上面的優化。html

 

準備環境

eclipse版本:Release 4.5.0java

eclipse 默認配置:eclipse.initomcat

 
-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的詳細日誌app

eclipse啓動計時插件:eclipse

http://www.chendd.cn/information/viewInformation/experienceShare/148.ajvm

GChisto.jar:gc日誌分析工具jar包一個socket

 

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
 

Tomcat服務器優化

一、JDK內存優化

   根據服務器物理內容狀況配置相關參數優化tomcat性能。當應用程序須要的內存超出堆的最大值時虛擬機就會提示內存溢出,而且致使應用服務崩潰。所以通常建議堆的最大值設置爲可用內存的最大值的80%。 Tomcat默承認以使用的內存爲128MB,在較大型的應用項目中,這點內存是不夠的,須要調大.

Tomcat默承認以使用的內存爲128MB,Windows下,在文件/bin/catalina.bat,Unix下,在文件/bin/catalina.sh的前面,增長以下設置: JAVA_OPTS='-Xms【初始化內存大小】 -Xmx【可使用的最大內存】 -XX:PermSize=64M -XX:MaxPermSize=128m' 須要把幾個參數值調大。例如: JAVA_OPTS='-Xms256m -Xmx512m' 表示初始化內存爲256MB,可使用的最大內存爲512MB。

  參數詳解 

 
   -server  啓用jdk 的 server 版;
   -Xms    java虛擬機初始化時的最小內存;
   -Xmx    java虛擬機可以使用的最大內存;
   -XX:PermSize    內存永久保留區域
   -XX:MaxPermSize   內存最大永久保留區域 
   -Xmn    jvm最小內存
 

32G 內存配置示例:

JAVA_OPTS="$JAVA_OPTS  -Xms10g -Xmx10g -XX:PermSize=1g -XX:MaxPermSize=2g -Xshare:off -Xmn1024m

 

二、tomcat線程優化

在tomcat配置文件server.xml中的配置中,和鏈接數相關的參數有:

maxThreads: Tomcat使用線程來處理接收的每一個請求。這個值表示Tomcat可建立的最大的線程數。默認值150。

acceptCount: 指定當全部可使用的處理請求的線程數都被使用時,能夠放處處理隊列中的請求數,超過這個數的請求將不予處理。默認值10。

minSpareThreads: Tomcat初始化時建立的線程數。默認值25。

maxSpareThreads: 一旦建立的線程超過這個值,Tomcat就會關閉再也不須要的socket線程。默認值75。

enableLookups: 是否反查域名,默認值爲true。爲了提升處理能力,應設置爲false

connnectionTimeout: 網絡鏈接超時,默認值60000,單位:毫秒。設置爲0表示永不超時,這樣設置有隱患的。一般可設置爲30000毫秒。

maxKeepAliveRequests: 保持請求數量,默認值100。 bufferSize: 輸入流緩衝大小,默認值2048 bytes。

compression: 壓縮傳輸,取值on/off/force,默認值off。 其中和最大鏈接數相關的參數爲maxThreads和acceptCount。若是要加大併發鏈接數,應同時加大這兩個參數。

32G 內存配置示例:

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000" maxThreads="1000" minSpareThreads="60" maxSpareThreads="600"  acceptCount="120"  
               redirectPort="8443" URIEncoding="utf-8"/>

 

 

使用visualvm性能監控

一、什麼是VisualVM

visualvm是jdk自帶的一款監控工具。它提供了一個可視界面,用於查看 Java 虛擬機上運行的基於 Java 技術的程序的詳細信息。VisualVM 對 Java Development Kit (JDK) 工具所檢索的 JVM 軟件相關數據進行組織,並經過一種使您能夠快速查看有關多個 Java 應用程序的數據的方式提供該信息。您能夠查看本地應用程序以及遠程主機上運行的應用程序的相關數據

二、如何安裝

在jkd bin目錄下有一個jvisualvm.exe文件 雙擊就可使用

三、如何使用jvisualvm

一、配置JMX管理tomcat:

set JAVA_OPTS=-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9008 -Dcom.sun.management.jmxremote.authenticate=false -    Dcom.sun.management.jmxremote.ssl=false

二、重啓tomcat便可

三、雙擊jvisualvm.exe 添加服務器IP地址,添加須要監控jmx端口便可

效果以下:

 

 

本文轉載自

原文做者:純潔的微笑 

原文地址:http://www.cnblogs.com/ityouknow/p/5378874.html

原文地址:https://www.cnblogs.com/ityouknow/p/6437037.html

相關文章
相關標籤/搜索