JVM 基本參數使用與調優及JVM分析工具初探

一、JVM參數類型

jvm參數類型一般包含以下三種類型:標準參數、X參數和XX參數。

1.1參數類型說明

1.1.1標準參數

功能和輸出已經穩定得,在未來的JVM版本中不會修改的參數。

圖1.jvm標準參數列表

1.1.2 X參數

非標準化參數 在未來的版本可能會改變 所有的參數都用-X開始可以使用java -X檢索。

常用的於java程序配置的X參數有:-Xms(設置堆區的初始內存)、-Xmx(設置堆區的最大內存)、-Xmn(設置新生代的大小)、-Xss(設置線程棧的大小)。

-Xms和-Xmx是當前智學組件啓動的必備參數,指定了組件初始的內存大小以及最大可使用內存的大小,通常這兩個值配置相同的數值;這兩個參數整體上決定了組件可實例化的對象的能力(業務處理能力)。配置示例:-Xms2g/-Xmx2g或者-Xms2048m/-Xmx2048m(配置大小單位g、m、k)。如果內存剩餘不到 40 %, JVM 就會增大堆到 Xmx 設置的值,內存剩餘超過 70 %, JVM 就會減小堆到 Xms 設置的值。所以服務器的 Xmx Xms 設置一般應該設置相同避免每次 GC 後都要調整虛擬機堆的大小。

-Xmn:設置堆中新生代的大小,在一定範圍內適當提高新生代的佔比可以提高服務的吞吐量,但是服務的吞吐量與新生代的大小並不正相關。sun建議該值取整個堆大小的3/8

-Xss:設置組件中線程棧的大小。如果線程中的調用過深,壓棧對象過多導致佔用棧內存的大小超過了線程棧設置的大小,會出現stackOverflow異常。可根據組件中的具體情況設置線程棧的大小。配置示例:-Xss256k,線程棧分配佔256k的內存空間。內存大小一定的情況下,該值設置的越小進程內可創建的線程就越多。

圖2.jvm X參數列表

 

1.1.3 XX參數

非標準參數,用於JVM開發的debug和調優,參數以-XX:開始。-XX:參數名稱

例如,-XX:MaxPermSize=128m,設置持久代的最大內存可以設置爲 128m;如果持久代存儲空間不夠創建新對象時,會報java.lang.OutOfMemoryError: PermGen space 內存溢出錯誤。一般解決方法:Java 內存溢出(java.lang.OutOfMemoryError)的常見情況和處理方式總結

有些XX參數和X參數是有相同對應關係的,比如-XX:InitialHeapSize的縮寫形式爲–Xms, -XX:MaxHeapSize的縮寫形式爲-Xmx。

二、使用jvm監控命令

一般用於查看服務運行時狀態的主要命令包括:jstat、jmap、top、jstack。

2.1 簡介

其中,jstat 用於查看服務器上某個服務的GC情況。一般使用方式jstat –gc[util]pid 時間間隔—每個一定時間(指定的時間間隔)輸出一次進程pid的內存情況及gc情況。

top用於查看機器上各個進程佔用系統資源的情況,按資源佔用資源(cpu、memory)的多少倒序排列佔用資源較多的進程。

jamp用於查看進程的內存使用情況(分析內存溢出)。一般使用命令 jmap –heap pid 或者 jmap –histo[:live]pid,以及 jmap –dump[:live],format=b,file=xx-heap.hprof pid 會dump堆內存的使用情況到一個指定的文件。當heap內存佔用比較大時,執行jmap –dump 會比較耗時。

jstack查看線程的運行狀態。一般使用命令 jstack pid | grep tid(16進制)-A 30,堆棧分析過程可參考(java命令--jstack 工具)。

2.2 綜合應用

GC問題分析藉助內存dump文件進行分析—未完待續。

1)       保存出問題時的進程的內存信息—dump文件。

2)       使用dump文件分析工具MAT(使用jmap和MAT分析JVM堆內存

 

一般分析組件問題可以經過一下幾個步驟定位異常問題(高CPU、線程死鎖):

1.查看佔用資源最多的進程(按佔用資源量倒序)

top [| more]

2.查看某進程的gc情況

jstat -gcutil pid [打印間隔時間] [打印次數]

該命令主要用於查看進程的內存使用情況(GC情況)

 

3.查看進程內線程佔用資源情況

ps -mp pid -o THREAD,tid,time | sort -rn | more

輸出線程id,時間

功能類似的命令:top –Hp pid 或者ps –Lfp pid(重點關注輸出結果中time 列數值較大的線程)

4.查看線程信息(根據3查到的線程id(轉爲16進制), 終端使用 printf “%x\n” tid 可將十進制線程號轉爲十六進制)

jstack pid | greptid(16進制) -A 30

(-A 30表示查找到所在行的後30行)

 

5. dump 線程信息,把服務運行時線程調用的堆棧信息以文件形式保存下來,便於排查類似內存溢出、線程死鎖等問題。

jstack pid >/PATH/xx-threaddump.txt

 

線程堆棧信息中線程狀態說明:對於thread dump信息,主要關注的是線程的狀態和其執行堆棧。線程的狀態一般爲三類:
1.Runnable(R):當前可以運行的線程
2.Waiting on monitor(CW):線程主動wait
3.Waiting for monitor entry(MW):線程等鎖
一般關注的都是第一和第三種狀態的線程
Cpu很忙則關注runnable的線程
Cpu
閒則關注waiting formonitor entry的線程

一種典型的死鎖是由於在server端應用(比如servlet)中請求由同一weblogic實例server的資源,解決辦法就是將該servlet放到另外的執行隊列裏去執行。綜合使用過程參考:JVM性能調優監控工具專題一:JVM自帶性能調優工具(jps,jstack,jmap,jhat,jstat,hprof)jstack和線程dump分析

 

參考文檔

1.JVM參數使用總結

2.tomcat啓動參數Xms, Xmx, XX:MaxNewSize, XX:PermSize,-XX:MaxPermSize, Djava.awt.headless

3.深入解析OutOfMemoryError

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章