1. 程式人生 > >JVM效能調優監控工具專題一:JVM自帶效能調優工具

JVM效能調優監控工具專題一:JVM自帶效能調優工具

前提概要: 

 JDK本身提供了很多方便的JVM效能調優監控工具,除了整合式的VisualVM和jConsole外,還有jps、jstack、jmap、jhat、jstat、hprof等小巧的工具,每一種工具都有其自身的特點,使用者可以根據你需要檢測的應用或者程式片段的狀況,適當的選擇相應的工具進行檢測。接下來的兩個專題分別會講VisualVM的具體應用。

現實企業級Java開發中,有時候我們會碰到下面這些問題:

  • OutOfMemoryError,記憶體不足

  • 記憶體洩露

  • 執行緒死鎖

  • 鎖爭用(Lock Contention)

  • Java程序消耗CPU過高

  • ......

這些問題在日常開發中可能被很多人忽視(比如有的人遇到上面的問題只是重啟伺服器或者調大記憶體,而不會深究問題根源),但能夠理解並解決這些問題是Java程式設計師進階的必備要求。

基本工具命令

    jps

      實際中這是最常用的命令,下面要介紹的小工具更多的都是先要使用jps查看出當前有哪些Java程序,獲取該Java程序的id後再對該程序進行處理。

    jps主要用來輸出JVM中執行的程序狀態資訊。語法格式如下:

  1. jps [options] [hostid]    

 如果不指定hostid就預設為當前主機或伺服器。

   命令列引數選項說明如下:

  1. -q 不輸出類名、Jar名和傳入main方法的引數  
  2. -m 輸出傳入main方法的引數  
  3. -l 輸出main類或Jar的全限名  
  4. -v 輸出傳入JVM的引數  

比如

1、我現在有一個WordCountTopo的Strom程式正在本機執行。

2、使用java -jar deadlock.jar & 啟動一個執行緒死鎖的程式 

  1. [email protected] /E  
  2. $ jps -ml  
  3. 14200 deadlock.jar  
  4. 13952 com.wsheng.storm.topology.WordCountTopo D://input/ 3  
  5. 13248 sun.tools.jps.Jps -ml  
  6. 9728  

    jstack 

jstack主要用來檢視某個Java程序內的執行緒堆疊資訊。語法格式如下:

  1. jstack [option] pid  
  2. jstack [option] executable core  
  3. jstack [option] [
    [email protected]
    ]remote-hostname-or-ip  

命令列引數選項說明如下
  1. -l long listings,會打印出額外的鎖資訊,在發生死鎖時可以用  jstack -l pid  來觀察鎖持有情況  
  2. -m mixed mode,不僅會輸出Java堆疊資訊,還會輸出C/C++堆疊資訊(比如Native方法)  

jstack可以定位到執行緒堆疊,根據堆疊資訊我們可以定位到具體程式碼,所以它在JVM效能調優中使用得非常多。

    下面我們來一個例項:

     找出某個Java程序中最耗費CPU的Java執行緒並定位堆疊資訊,用到的命令有ps、top、printf、jstack、grep。

   先找出Java程序ID,伺服器上的Java應用名稱為wordcount.jar:

  1. [[email protected] home]# ps -ef | grep wordcount | grep -v grep  
  2. root       2860   2547 13 02:09 pts/0    00:02:03 java -jar wordcount.jar /home/input 3  

    得到程序ID為2860(也可以使用其它方式得到java的程序號),

    找出該程序內最耗費CPU的執行緒,可以使用如下3個命令,這裡我們使用第3個命令得出如下結果:

  1. 1)ps -Lfp pid : 即 ps -Lfp 2860  
  2. 2)ps -mp pid -o THREAD, tid, time :即 ps -mp 2860 -o THREAD,tid,time  
  3. 3)top -Hp pid: 即   top -Hp 2860  


 

  TIME列就是各個Java執行緒耗費的CPU時間,顯然CPU時間最長的是ID為2968的執行緒,用

  1. printf "%x\n" 2968  

    得到2968的十六進位制值為b98,下面會用到。     

 終於輪到jstack上場了,它用來輸出程序2860的堆疊資訊,然後根據執行緒ID的十六進位制值grep,如下:

  1. [[email protected] home]# jstack 2860 | grep b98  
  2. "SessionTracker" prio=10 tid=0x00007f55a44e4800 nid=0xb53 in Object.wait() [0x00007f558e06c000  

 可以看到CPU消耗在SessionTracker這個類的Object.wait(),於是就能很容易的定位到相關的程式碼了。

jmap和 jhat

    jmap用來檢視堆記憶體使用狀況,一般結合jhat使用。

     jmap語法格式如下:

  1. jmap [option] pid  
  2. jmap [option] executable core  
  3. jmap [option] [[email protected]]remote-hostname-or-ip  

 如果執行在64位JVM上,由於linux作業系統的不同,可能需要指定-J-d64命令選項引數。

    列印程序的類載入器和類載入器載入的持久代物件資訊: jmap -permstat pid

個人感覺這個不是太有用蠢話

輸出:類載入器名稱、物件是否存活(不可靠)、物件地址、父類載入器、已載入的類大小等資訊,如圖:

 

    檢視程序堆記憶體使用情況:包括使用的GC演算法、堆配置引數和各代中堆記憶體使用jmap -heap pid

比如下面的例子

  1. [[email protected] home]# jmap -heap 2860  
  2. Attaching to process ID 2860, please wait...  
  3. Debugger attached successfully.  
  4. Server compiler detected.  
  5. JVM version is 20.45-b01  
  6. using thread-local object allocation.  
  7. Mark Sweep Compact GC  
  8. Heap Configuration:  
  9.    MinHeapFreeRatio = 40  
  10.    MaxHeapFreeRatio = 70  
  11.    MaxHeapSize      = 257949696 (246.0MB)  
  12.    NewSize          = 1310720 (1.25MB)  
  13.    MaxNewSize       = 17592186044415 MB  
  14.    OldSize          = 5439488 (5.1875MB)  
  15.    NewRatio         = 2  
  16.    SurvivorRatio    = 8  
  17.    PermSize         = 21757952 (20.75MB)  
  18.    MaxPermSize      = 85983232 (82.0MB)  
  19. Heap Usage:  
  20. New Generation (Eden + 1 Survivor Space):  
  21.    capacity = 12189696 (11.625MB)  
  22.    used     = 6769392 (6.4557952880859375MB)  
  23.    free     = 5420304 (5.1692047119140625MB)  
  24.    55.53372290826613% used  
  25. Eden Space:  
  26.    capacity = 10878976 (10.375MB)  
  27.    used     = 6585608 (6.280525207519531MB)  
  28.    free     = 4293368 (4.094474792480469MB)  
  29.    60.53518272307982% used  
  30. From Space:  
  31.    capacity = 1310720 (1.25MB)  
  32.    used     = 183784 (0.17527008056640625MB)  
  33.    free     = 1126936 (1.0747299194335938MB)  
  34.    14.0216064453125% used  
  35. To Space:  
  36.    capacity = 1310720 (1.25MB)  
  37.    used     = 0 (0.0MB)  
  38.    free     = 1310720 (1.25MB)  
  39.    0.0% used  
  40. tenured generation:  
  41.    capacity = 26619904 (25.38671875MB)  
  42.    used     = 15785896 (15.054603576660156MB)  
  43.    free     = 10834008 (10.332115173339844MB)  
  44.    59.30110040967841% used  
  45. Perm Generation:  
  46.    capacity = 33554432 (32.0MB)  
  47.    used     = 33323352 (31.779624938964844MB)  
  48.    free     = 231080 (0.22037506103515625MB)  
  49.    99.31132793426514% used  

    檢視堆記憶體中的物件數目、大小統計直方圖,如果帶上live則只統計活物件:jmap -histo[:live] pid

  1. [[email protected] Desktop]# jmap -histo 2860  
  2.  num     #instances         #bytes  class name  
  3. ----------------------------------------------  
  4.    1:         13917       11432488  [B  
  5.    2:          6117        6181448  <instanceKlassKlass>  
  6.    3:         39520        6004504  <constMethodKlass>  
  7.    4:          6117        5517072  <constantPoolKlass>  
  8.    5:         39520        5383280  <methodKlass>  
  9.    6:          5148        3150944  <constantPoolCacheKlass>  
  10.    7:         29954        2810640  [C  
  11.    8:         50179        2469272  <symbolKlass>  
  12.    9:         42122        1791704  [Ljava.lang.Object;  
  13.   10:          1804         961464  <methodDataKlass>  
  14.   11:         11747         941200  [Ljava.util.HashMap$Entry;  
  15.   12:         28786         921152  java.lang.String  
  16.   13:          6347         660088  java.lang.Class  
  17.   14:          7374         625616  [S  
  18.   15:         11740         563520  java.util.HashMap  
  19.   16:         23447         562728  clojure.lang.PersistentHashMap$BitmapIndexedNode  
  20.   17:         10980         351360  clojure.lang.Symbol  
  21.   18:          8544         341760  java.lang.ref.SoftReference  
  22.   19:          8028         336632  [[I  
  23.   20:          3944         283968  java.lang.reflect.Constructor  
  24.   21:          4744         227712  java.nio.HeapByteBuffer  
  25.   22:          6854         219328  java.util.AbstractList$Itr  
  26.   23:          2185         195192  [I  
  27.   24:          3854         184992  java.nio.HeapCharBuffer  
  28.   25:          5500         176000  java.util.concurrent.ConcurrentHashMap$HashEntry  

 class name是物件型別,說明如下: 
  1. B  byte  
  2. C  char  
  3. D  double  
  4. F  float  
  5. I  int  
  6. J  long  
  7. Z  boolean  
  8. [  陣列,如[I表示int[]  
  9. [L+類名 其他物件  

還有一個很常用的情況是:用jmap把程序記憶體使用情況dump到檔案中,再用jhat分析檢視。需要注意的是 dump出來的檔案還可以用MAT、VisualVM等工具檢視。

jmap進行dump命令格式如下:

  1. jmap -dump:format=b,file=dumpFileName pid  

相關推薦

JVM效能調監控工具專題JVM效能調工具

前提概要:  JDK本身提供了很多方便的JVM效能調優監控工具,除了整合式的VisualVM和jConsole外,還有jps、jstack、jmap、jhat、jstat、hprof等小巧的工具,每一種工具都有其自身的特點,使用者可以根據你需要檢測的應用或者程式片段的狀況,適

JVM效能分析工具介紹——jstack

轉載: https://blog.csdn.net/Roy_70/article/details/78021551 前言 JDK本身提供了很多方便的JVM效能調優監控工具,除了整合式的VisualVM和jConsole外,還有jps、jstack、jmap、jhat、jstat、h

JVM效能分析工具介紹——jstat

前言 JDK本身提供了很多方便的JVM效能調優監控工具,除了整合式的VisualVM和jConsole外,還有jps、jstack、jmap、jhat、jstat、hprof等小巧的工具,每一種工具都有其自身的特點,使用者可以根據你需要檢測的應用或者程式片段的

Android應用記錄有道翻譯API調

.get 返回結果 是我 git 最新版 cts json數據 調用 sla 因為某些原因,我需要記單詞,而且討厭廣告,所以就想著自己寫個能夠查自己不認識的單詞並且以後可以隨時查看的APP。 首先我需要調用一個翻譯API,中文翻譯比較好用的API有有道翻譯API,百度翻譯A

JVM性能分析工具介紹——jmap和jhat

inf info weibo 介紹 oci mar style lan user 0L蛻投M口l形繃9http://huiyi.docin.com/sina_5847440681 RH姥胤1操士剮訊39鎂http://www.docin.com/sina_62699771

JVM性能分析工具介紹——jstat

mfp ldd 性能分析工具 blank pxn qtp targe 自帶 mcs 炭撐pcdw1律v煌映40嘔http://tushu.docin.com/sina_6345212704 倩角72g傲28蛻iy墾84http://tushu.docin.com/sina_

java工具日期處理

div 方便 開始 .text simple nor atd blog param 作者:NiceCui 本文謝絕轉載,如需轉載需征得作者本人同意,謝謝。 本文鏈接:http://www.cnblogs.com/NiceCui/p/7846812.html 郵箱:

嵌入式框架Zorb Framework搭建嵌入式環境搭建、調試輸出和建立時間系統

面向對象 RoCE 定時器 eve 不用 時間 prior 定時 con 我是卓波,我是一名嵌入式工程師,我萬萬沒想到我會在這裏跟大家吹牛皮。 嵌入式框架Zorb Framework搭建過程 嵌入式框架Zorb Framework搭建一:嵌入式環境搭建、調試輸出和建立時間系

工具字串工具

/** * 字串工具類 * @author * */ public class StringUtil { /** * 判斷是否是空 * @param str * @return */ public static boolea

【轉載】JVM系列JVM記憶體組成及分配

java記憶體組成介紹:堆(Heap)和非堆(Non-heap)記憶體        按照官方的說法:“Java 虛擬機器具有一個堆,堆是執行時資料區域,所有類例項和陣列的記憶體均從此處分配。堆是在 Java 虛擬機器啟動時建立的。”“在JVM中堆

天地圖專題載入天地圖

最近公司的專案到了尾聲。總結一下專案中的一些技術。其中有涉及到天地圖的部分。 類似百度地圖,google地圖。 我們要用一些它的公共介面,實現一些我們的效果。  比如在地圖上顯示我們的裝置的位置,範圍,執行軌跡等等。 大多數的功能其實都只是參考天地圖官方api。http://api.t

JVM類載入機制詳解(JVM類載入過程

首先Throws(丟擲)幾個自己學習過程中一直疑惑的問題: 1、什麼是類載入?什麼時候進行類載入? 2、什麼是類初始化?什麼時候進行類初始化? 3、什麼時候會為變數分配記憶體? 4、什麼時候會為變數賦

Python3下載專題下載網易雲音樂

一:開啟網易雲音樂,在搜尋框內輸入歌曲名稱,如"海闊天空" 二:選擇第一個,並開啟,這時的url = “https://music.163.com/#/song?id=400162138” 記住id:400162138 三:網易提供的外部下載連結:“http://music.163.co

DP動態規劃專題 LeetCode 91. Decode Ways

LeetCode 91. Decode Ways A message containing letters from A-Z is being encoded to numbers using the following mapping: ‘A’ -> 1 ‘B’ ->

JVM解讀()JVM體系結構

JVM全稱是java Virtual Machine(java虛擬機器),JVM遮蔽了與各個計算機平臺相關的軟體和硬體差異 在接下來的日子裡,我要通過寫部落格的形式學習JVM,讓自己更懂得Java 本系列文章是對《深入分析javaweb技術內幕》和《深入理解ja

C語言之指標專題指標變數和指標所指向的記憶體空間是兩個不同的概念

指標變數和指標所指向的記憶體空間是兩個不同的概念 char*p = "123456";//p是一個指標變數存放在臨時棧區,"123456"是一個字串常量存放在常量區,變數p儲存的是字串的地址 char*str = (char*)malloc(100);//將分配的100位

NodeJS總結()快速除錯nodejs的三種工具

1. 內建node-inspect + Chrome 這是官方團隊親自開發的除錯工具,支援long/async棧跟蹤等高階特性,與Chrome可以無縫結合,啟動步驟如下: 1. 執行node-inspect命令,啟動除錯; 2. 開啟Chrome,並在位址

程式碼自動生成工具)-Csv讀表程式碼自動生成工具

之前提到了自定義的Csv格式的表格讀取的一個工具類CsvReader 這裡我們實現一個可以對任意符合我們人為規定的格式的Csv檔案,自動生成其對應的讀表程式碼 本工具需要boost庫支援,本人用的是1.55.0 這裡首先定義Csv中支援的幾種列型別:FieldType:

JVM系列-04-JDK的管理分析工具

宣告 本篇文章是本人閱讀《深入理解JVM》和《java虛擬機器規範》時的筆記。 記錄的都是一些概念性的東西。 JVM是HotSpot,jdk1.7。 大神繞路,不喜勿噴。 1 概覽 對於java程式設計師來說,java、javac、ja

Hive 程式設計專題 使用正則指定輸出列

環境: Hive: 2.7.7 Oracle SQL Developer Cloudera JDBC Driver 案例: select type,nameobject,`*date` from tblobj2 limit 10 ; 錯誤: 1 - 使用