1. 程式人生 > >JVM 基本引數使用與調優及JVM分析工具初探

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檔案。

一般分析元件問題可以經過一下幾個步驟定位異常問題(高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的執行緒

參考文件