jvm調優(yōu)

命令 解釋
jps(jps -mlvV) 與Linux上的ps類似,用來顯示本地的java進程勋拟,可以查看本地運行著幾個java程序室谚,并顯示他們的進程號逸尖。
jstat(man jstat/ jstat -gc $jpid) 監(jiān)視VM內存工具,可以用來監(jiān)視VM內存內的各種堆和非堆的大小及其內存使用量彩扔。
jmap(Memory Map /jmap -heap $jpid) 打印出某個java進程(使用pid)內存內的,所有‘對象’的情況(如:產(chǎn)生那些對象僻爽,及其數(shù)量)虫碉。
jstack(Linux特有/ jstack -l $jpid) 觀察jvm中當前所有線程的運行情況和線程當前狀態(tài)。
jinfo(Linux特有/ jinfo $jpid) 運行中的java程序的運行環(huán)境參數(shù)胸梆,參數(shù)包括Java System屬性和JVM命令行參數(shù)
jconsole 結合上述功能的GUI工具蔗衡,監(jiān)控到:CPU纤虽、內存、線程數(shù)绞惦、類數(shù)量逼纸,展現(xiàn)VM摘要、Mbean集屬性济蝉。
jvisualvm Java5之后內置的監(jiān)控工具杰刽,和Jconsole相似,Dump功能強大王滤!并有Profile功能贺嫂。
jhat 用于解析Java的Dump文件,并啟動Web服務供瀏覽雁乡。

以下是Java自帶的性能監(jiān)控工具

命令 解釋
jps(jps -mlvV) 與Linux上的ps類似第喳,用來顯示本地的java進程,可以查看本地運行著幾個java程序踱稍,并顯示他們的進程號曲饱。
jstat(man jstat/ jstat -gc $jpid) 監(jiān)視VM內存工具,可以用來監(jiān)視VM內存內的各種堆和非堆的大小及其內存使用量珠月。
jmap(Memory Map /jmap -heap $jpid) 打印出某個java進程(使用pid)內存內的扩淀,所有‘對象’的情況(如:產(chǎn)生那些對象,及其數(shù)量)啤挎。
jstack(Linux特有/ jstack -l $jpid) 觀察jvm中當前所有線程的運行情況和線程當前狀態(tài)驻谆。
jinfo(Linux特有/ jinfo $jpid) 運行中的java程序的運行環(huán)境參數(shù),參數(shù)包括Java System屬性和JVM命令行參數(shù)
jconsole 結合上述功能的GUI工具庆聘,監(jiān)控到:CPU胜臊、內存、線程數(shù)伙判、類數(shù)量区端,展現(xiàn)VM摘要、Mbean集屬性澳腹。
jvisualvm Java5之后內置的監(jiān)控工具织盼,和Jconsole相似,Dump功能強大酱塔!并有Profile功能沥邻。
jhat 用于解析Java的Dump文件,并啟動Web服務供瀏覽羊娃。
抓取Java全內存的Dump
jmap -dump <options>
jvm中添加參數(shù):-XX:+HeapDumpOnOutOfMemoryError 在符合條件時會輸出Dump唐全。
hprof輸出:java -agentlib:hprof[=options] ToBeProfiledClass / java -agentlib:hprof=help
jvisualvm:有界面,可生成各種鏡像和Dump。

必要時我們需要抓取Java全內存的Dump來分析邮利,抓取方式有如下:

抓取Java全內存的Dump
jmap -dump <options>
jvm中添加參數(shù):-XX:+HeapDumpOnOutOfMemoryError 在符合條件時會輸出Dump弥雹。
hprof輸出:java -agentlib:hprof[=options] ToBeProfiledClass / java -agentlib:hprof=help
jvisualvm:有界面,可生成各種鏡像和Dump延届。
那么Dump怎樣分析呢剪勿?

| jhat | 用于解析Java的Dump文件,并啟動Web服務供瀏覽方庭。 |
| mat(Memory Analyzer) | 開源分析工具厕吉,可形成報告。官網(wǎng):http://www.eclipse.org/mat/ |

JDK還內置了一些演示程序供參考械念,給被監(jiān)控程序添加[啟動參數(shù)](http://hi.baidu.com/higkoo/blog/item/29872f4af62f8c2408f7ef5d.html)后執(zhí)行以下指令:

| java -jar $JAVA_HOME/demo/management/MemoryMonitor/MemoryMonitor.jar192.168.223.108:8950 |
| java -jar $JAVA_HOME/demo/management/FullThreadDump/FullThreadDump.jar 192.168.223.108:8950 |
| java -jar $JAVA_HOME/demo/management/JTop/JTop.jar 192.168.223.108:8950 |
| java -jar $JAVA_HOME/demo/management/VerboseGC/VerboseGC.jar 192.168.223.108:8950 |

OK头朱,由于篇幅限制,接下來介紹一下商業(yè)監(jiān)控工具吧:
工具 網(wǎng)址
Jprofiler http://www.ej-technologies.com/
JRockit http://www.oracle.com/technetwork/middleware/jrockit/overview/index.html
Yourkit http://www.yourkit.com
Jprofiler專門針對Java性能監(jiān)控設計龄减。

JRockit則是一套JVM项钮,有其配套的監(jiān)控系統(tǒng)和工具。

Yourkit沒用過希停,出品了java和.net的監(jiān)控烁巫。

廢話不多說,下面我來演示一下如何Jprofile來定位Java的性能問題脖苏。以Jboss為例:

在/usr/local/jboss/bin/run.conf里添加JAVA_OPTS:`-agentpath:libjprofilerti.so=port=8849`,啟動Jboss定踱。

這里我做了示例程序棍潘,在此理解為某產(chǎn)品的三個版本。訪問方式如下:

http://TestServer/Servlet/Demo?Version=1
http://TestServer/Servlet/Demo?Version=2
http://TestServer/Servlet/Demo?Version=3

性能體現(xiàn)如下:

v1:正常崖媚,性能好且表現(xiàn)穩(wěn)定(點擊率曲線平穩(wěn)在6600)
v2:性能下降明顯(點擊率曲線平穩(wěn)在2800)亦歉,需要盡快找出原因
v3:程序不穩(wěn)定,運行越來越慢(剛啟動是點擊率約4200畅哑,隨后漸跌至0)肴楷,久了就宕機(后臺拋內存溢出)

使用Jprofile監(jiān)控,問題輕松被定位荠呐。如下圖:

    1赛蔫、“CPU Views”部分為進行v2的測試過程截圖。問題定位在加解密上泥张,即這塊需要優(yōu)化呵恢。

    2、“Heap Walker”部分為進行v3的測試過程截圖媚创。問題定位在Session處理上渗钉,說明Session機制需要調整。

上述示例的代碼也貼出來了钞钙,AES加密代碼較多未貼需要讀者自己實現(xiàn)了:

package com.higkoo.tester;

public class Demo extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
        String version = request.getParameter("Version");
        response.setContentType("text/html ;charset=UTF-8");
        response.setHeader("Cache-Control", "no-cache");
        PrintWriter out = response.getWriter();
        String result = new String();
        String rand = UUID.randomUUID().toString();
         if(version==null) version = "0";

        switch(Integer.parseInt(version)){
            case 1:
                result = "Version1:" + ClacMD5(rand);
                break;
            case 2:
                result = "Version2:" + ClacAES(rand);
                break;
            case 3:                
                result = "Version3:" + MakeSession(request,rand);
                break;
            default:    
                result = "Default:" + "Hello higkoo !";
                break;
        }
        out.write(result);
        out.close();
    }

    public String ClacMD5(String str){
        MessageDigest md = MessageDigest.getInstance("MD5");

        byte[] array = md.digest(str.getBytes("utf-8"));
        StringBuffer sb =new StringBuffer();
        String result = new String();
        if(str !=null){
            for(int i =0; i < array.length; i++){
                    sb.append(Integer.toHexString((array[i]&0xFF)|0x100).toUpperCase().substring(1,3));
                }
            result = sb.toString();
        }
        return result;
    }

    public String ClacAES(String str){
        String kStr = "866563b712d204d82876d1153d06c1f11";
        String result = new String();
        String eStr = AESUtil.encrypt(AESUtil.encrypt(AESUtil.encrypt(str.replaceAll("-", ""), kStr),kStr),kStr);
        result = AESUtil.decrypt(AESUtil.decrypt(AESUtil.decrypt(eStr, kStr),kStr),kStr);       
        return result.toUpperCase();
    }

    public String MakeSession(HttpServletRequest request,String str) {
        HttpSession session=request.getSession(true);
        session.setAttribute("accessCount", str); 
        return session.getId() ;
    }
}

原文:http://blog.csdn.net/ayan117/article/details/6832249
參考:http://blog.csdn.net/fenglibing/article/details/6411940




運用jvm自帶的命令可以方便的在生產(chǎn)監(jiān)控和打印堆棧的日志信息幫忙我們來定位問題鳄橘!雖然jvm調優(yōu)成熟的工具已經(jīng)有很多:jconsole声离、大名鼎鼎的VisualVM,IBM的Memory Analyzer等等瘫怜,但是在生產(chǎn)環(huán)境出現(xiàn)問題的時候术徊,一方面工具的使用會有所限制,另一方面喜歡裝X的我們宝磨,總喜歡在出現(xiàn)問題的時候在終端輸入一些命令來解決弧关。所有的工具幾乎都是依賴于jdk的接口和底層的這些命令,研究這些命令的使用也讓我們更能了解jvm構成和特性唤锉。

Sun JDK監(jiān)控和故障處理命令有jps jstat jmap jhat jstack jinfo下面做一一介紹

jps

JVM Process Status Tool,顯示指定系統(tǒng)內所有的HotSpot虛擬機進程世囊。

命令格式

jps [options] [hostid]

option參數(shù)

  • -l : 輸出主類全名或jar路徑
  • -q : 只輸出LVMID
  • -m : 輸出JVM啟動時傳遞給main()的參數(shù)
  • -v : 輸出JVM啟動時顯示指定的JVM參數(shù)

其中[option]、[hostid]參數(shù)也可以不寫窿祥。

示例

$ jps -l -m
  28920 org.apache.catalina.startup.Bootstrap start
  11589 org.apache.catalina.startup.Bootstrap start
  25816 sun.tools.jps.Jps -l -m

jstat

jstat(JVM statistics Monitoring)是用于監(jiān)視虛擬機運行時狀態(tài)信息的命令株憾,它可以顯示出虛擬機進程中的類裝載、內存晒衩、垃圾收集嗤瞎、JIT編譯等運行數(shù)據(jù)。

命令格式

jstat [option] LVMID [interval] [count]

參數(shù)

  • [option] : 操作參數(shù)
  • LVMID : 本地虛擬機進程ID
  • [interval] : 連續(xù)輸出的時間間隔
  • [count] : 連續(xù)輸出的次數(shù)

option 參數(shù)總覽

Option Displays…
class class loader的行為統(tǒng)計听系。Statistics on the behavior of the class loader.
compiler HotSpt JIT編譯器行為統(tǒng)計贝奇。Statistics of the behavior of the HotSpot Just-in-Time compiler.
gc 垃圾回收堆的行為統(tǒng)計。Statistics of the behavior of the garbage collected heap.
gccapacity 各個垃圾回收代容量(young,old,perm)和他們相應的空間統(tǒng)計靠胜。Statistics of the capacities of the generations and their corresponding spaces.
gcutil 垃圾回收統(tǒng)計概述掉瞳。Summary of garbage collection statistics.
gccause 垃圾收集統(tǒng)計概述(同-gcutil),附加最近兩次垃圾回收事件的原因浪漠。Summary of garbage collection statistics (same as -gcutil), with the cause of the last and
gcnew 新生代行為統(tǒng)計陕习。Statistics of the behavior of the new generation.
gcnewcapacity 新生代與其相應的內存空間的統(tǒng)計。Statistics of the sizes of the new generations and its corresponding spaces.
gcold 年老代和永生代行為統(tǒng)計址愿。Statistics of the behavior of the old and permanent generations.
gcoldcapacity 年老代行為統(tǒng)計该镣。Statistics of the sizes of the old generation.
gcpermcapacity 永生代行為統(tǒng)計。Statistics of the sizes of the permanent generation.
printcompilation HotSpot編譯方法統(tǒng)計响谓。HotSpot compilation method statistics.

option 參數(shù)詳解

-class

監(jiān)視類裝載损合、卸載數(shù)量、總空間以及耗費的時間

$ jstat -class 11589
 Loaded  Bytes  Unloaded  Bytes     Time   
  7035  14506.3     0     0.0       3.67

  • Loaded : 加載class的數(shù)量
  • Bytes : class字節(jié)大小
  • Unloaded : 未加載class的數(shù)量
  • Bytes : 未加載class的字節(jié)大小
  • Time : 加載時間
-compiler

輸出JIT編譯過的方法數(shù)量耗時等

$ jstat -compiler 1262
Compiled Failed Invalid   Time   FailedType FailedMethod
    2573      1       0    47.60          1 org/apache/catalina/loader/WebappClassLoader findResourceInternal  

  • Compiled : 編譯數(shù)量
  • Failed : 編譯失敗數(shù)量
  • Invalid : 無效數(shù)量
  • Time : 編譯耗時
  • FailedType : 失敗類型
  • FailedMethod : 失敗方法的全限定名
-gc

垃圾回收堆的行為統(tǒng)計娘纷,常用命令

$ jstat -gc 1262
 S0C    S1C     S0U     S1U   EC       EU        OC         OU        PC       PU         YGC    YGCT    FGC    FGCT     GCT   
26112.0 24064.0 6562.5  0.0   564224.0 76274.5   434176.0   388518.3  524288.0 42724.7    320    6.417   1      0.398    6.815

C即Capacity 總容量塌忽,U即Used 已使用的容量

  • S0C : survivor0區(qū)的總容量
  • S1C : survivor1區(qū)的總容量
  • S0U : survivor0區(qū)已使用的容量
  • S1U : survivor1區(qū)已使用的容量
  • EC : Eden區(qū)的總容量
  • EU : Eden區(qū)已使用的容量
  • OC : Old區(qū)的總容量
  • OU : Old區(qū)已使用的容量
  • PC 當前perm的容量 (KB)
  • PU perm的使用 (KB)
  • YGC : 新生代垃圾回收次數(shù)
  • YGCT : 新生代垃圾回收時間
  • FGC : 老年代垃圾回收次數(shù)
  • FGCT : 老年代垃圾回收時間
  • GCT : 垃圾回收總消耗時間
$ jstat -gc 1262 2000 20

這個命令意思就是每隔2000ms輸出1262的gc情況,一共輸出20次

-gccapacity

同-gc失驶,不過還會輸出Java堆各區(qū)域使用到的最大土居、最小空間

$ jstat -gccapacity 1262
 NGCMN    NGCMX     NGC    S0C   S1C       EC         OGCMN      OGCMX      OGC        OC       PGCMN    PGCMX     PGC      PC         YGC    FGC 
614400.0 614400.0 614400.0 26112.0 24064.0 564224.0   434176.0   434176.0   434176.0   434176.0 524288.0 1048576.0 524288.0 524288.0    320     1  

  • NGCMN : 新生代占用的最小空間
  • NGCMX : 新生代占用的最大空間
  • OGCMN : 老年代占用的最小空間
  • OGCMX : 老年代占用的最大空間
  • OGC:當前年老代的容量 (KB)
  • OC:當前年老代的空間 (KB)
  • PGCMN : perm占用的最小空間
  • PGCMX : perm占用的最大空間
-gcutil

同-gc,不過輸出的是已使用空間占總空間的百分比

$ jstat -gcutil 28920
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
 12.45   0.00  33.85   0.00   4.44  4       0.242     0    0.000    0.242

-gccause

垃圾收集統(tǒng)計概述(同-gcutil),附加最近兩次垃圾回收事件的原因

$ jstat -gccause 28920
  S0     S1     E      O      P       YGC     YGCT    FGC    FGCT     GCT    LGCC                 GCC                 
 12.45   0.00  33.85   0.00   4.44      4    0.242     0    0.000    0.242   Allocation Failure   No GC  

  • LGCC:最近垃圾回收的原因
  • GCC:當前垃圾回收的原因
-gcnew

統(tǒng)計新生代的行為

$ jstat -gcnew 28920
 S0C      S1C      S0U        S1U  TT  MTT  DSS      EC        EU         YGC     YGCT  
 419392.0 419392.0 52231.8    0.0  6   6    209696.0 3355520.0 1172246.0  4       0.242

  • TT:Tenuring threshold(提升閾值)
  • MTT:最大的tenuring threshold
  • DSS:survivor區(qū)域大小 (KB)
-gcnewcapacity

新生代與其相應的內存空間的統(tǒng)計

$ jstat -gcnewcapacity 28920
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC        YGC   FGC 
 4194304.0  4194304.0  4194304.0 419392.0 419392.0 419392.0 419392.0  3355520.0  3355520.0     4     0

  • NGC:當前年輕代的容量 (KB)
  • S0CMX:最大的S0空間 (KB)
  • S0C:當前S0空間 (KB)
  • ECMX:最大eden空間 (KB)
  • EC:當前eden空間 (KB)
-gcold

統(tǒng)計舊生代的行為

$ jstat -gcold 28920
   PC       PU        OC           OU       YGC    FGC    FGCT     GCT   
1048576.0  46561.7   6291456.0     0.0      4      0      0.000    0.242

-gcoldcapacity

統(tǒng)計舊生代的大小和空間

$ jstat -gcoldcapacity 28920
   OGCMN       OGCMX        OGC         OC         YGC   FGC    FGCT     GCT   
  6291456.0   6291456.0   6291456.0   6291456.0     4     0    0.000    0.242

-gcpermcapacity

永生代行為統(tǒng)計

$ jstat -gcpermcapacity 28920
    PGCMN      PGCMX       PGC         PC      YGC   FGC    FGCT     GCT   
 1048576.0  2097152.0  1048576.0  1048576.0     4     0    0.000    0.242

-printcompilation

hotspot編譯方法統(tǒng)計

$ jstat -printcompilation 28920
    Compiled  Size  Type Method
    1291      78     1    java/util/ArrayList indexOf

  • Compiled:被執(zhí)行的編譯任務的數(shù)量
  • Size:方法字節(jié)碼的字節(jié)數(shù)
  • Type:編譯類型
  • Method:編譯方法的類名和方法名擦耀。類名使用”/” 代替 “.” 作為空間分隔符. 方法名是給出類的方法名. 格式是一致于HotSpot - XX:+PrintComplation 選項

jmap

jmap(JVM Memory Map)命令用于生成heap dump文件棉圈,如果不使用這個命令,還闊以使用-XX:+HeapDumpOnOutOfMemoryError參數(shù)來讓虛擬機出現(xiàn)OOM的時候·自動生成dump文件眷蜓。 jmap不僅能生成dump文件分瘾,還闊以查詢finalize執(zhí)行隊列、Java堆和永久代的詳細信息吁系,如當前使用率德召、當前使用的是哪種收集器等。

命令格式

jmap [option] LVMID

option參數(shù)

  • dump : 生成堆轉儲快照
  • finalizerinfo : 顯示在F-Queue隊列等待Finalizer線程執(zhí)行finalizer方法的對象
  • heap : 顯示Java堆詳細信息
  • histo : 顯示堆中對象的統(tǒng)計信息
  • permstat : to print permanent generation statistics
  • F : 當-dump沒有響應時汽纤,強制生成dump快照

示例

-dump

常用格式

-dump::live,format=b,file=<filename> pid 

dump堆到文件,format指定輸出格式上岗,live指明是活著的對象,file指定文件名

$ jmap -dump:live,format=b,file=dump.hprof 28920
  Dumping heap to /home/xxx/dump.hprof ...
  Heap dump file created

dump.hprof這個后綴是為了后續(xù)可以直接用MAT(Memory Anlysis Tool)打開。

-finalizerinfo

打印等待回收對象的信息

$ jmap -finalizerinfo 28920
  Attaching to process ID 28920, please wait...
  Debugger attached successfully.
  Server compiler detected.
  JVM version is 24.71-b01
  Number of objects pending for finalization: 0

可以看到當前F-QUEUE隊列中并沒有等待Finalizer線程執(zhí)行finalizer方法的對象蕴坪。

-heap

打印heap的概要信息肴掷,GC使用的算法,heap的配置及wise heap的使用情況,可以用此來判斷內存目前的使用情況以及垃圾回收情況

$ jmap -heap 28920
  Attaching to process ID 28920, please wait...
  Debugger attached successfully.
  Server compiler detected.
  JVM version is 24.71-b01  

  using thread-local object allocation.
  Parallel GC with 4 thread(s)//GC 方式  

  Heap Configuration: //堆內存初始化配置
     MinHeapFreeRatio = 0 //對應jvm啟動參數(shù)-XX:MinHeapFreeRatio設置JVM堆最小空閑比率(default 40)
     MaxHeapFreeRatio = 100 //對應jvm啟動參數(shù) -XX:MaxHeapFreeRatio設置JVM堆最大空閑比率(default 70)
     MaxHeapSize      = 2082471936 (1986.0MB) //對應jvm啟動參數(shù)-XX:MaxHeapSize=設置JVM堆的最大大小
     NewSize          = 1310720 (1.25MB)//對應jvm啟動參數(shù)-XX:NewSize=設置JVM堆的‘新生代’的默認大小
     MaxNewSize       = 17592186044415 MB//對應jvm啟動參數(shù)-XX:MaxNewSize=設置JVM堆的‘新生代’的最大大小
     OldSize          = 5439488 (5.1875MB)//對應jvm啟動參數(shù)-XX:OldSize=<value>:設置JVM堆的‘老生代’的大小
     NewRatio         = 2 //對應jvm啟動參數(shù)-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
     SurvivorRatio    = 8 //對應jvm啟動參數(shù)-XX:SurvivorRatio=設置年輕代中Eden區(qū)與Survivor區(qū)的大小比值 
     PermSize         = 21757952 (20.75MB)  //對應jvm啟動參數(shù)-XX:PermSize=<value>:設置JVM堆的‘永生代’的初始大小
     MaxPermSize      = 85983232 (82.0MB)//對應jvm啟動參數(shù)-XX:MaxPermSize=<value>:設置JVM堆的‘永生代’的最大大小
     G1HeapRegionSize = 0 (0.0MB)  

  Heap Usage://堆內存使用情況
  PS Young Generation
  Eden Space://Eden區(qū)內存分布
     capacity = 33030144 (31.5MB)//Eden區(qū)總容量
     used     = 1524040 (1.4534378051757812MB)  //Eden區(qū)已使用
     free     = 31506104 (30.04656219482422MB)  //Eden區(qū)剩余容量
     4.614088270399305% used //Eden區(qū)使用比率
  From Space:  //其中一個Survivor區(qū)的內存分布
     capacity = 5242880 (5.0MB)
     used     = 0 (0.0MB)
     free     = 5242880 (5.0MB)
     0.0% used
  To Space:  //另一個Survivor區(qū)的內存分布
     capacity = 5242880 (5.0MB)
     used     = 0 (0.0MB)
     free     = 5242880 (5.0MB)
     0.0% used
  PS Old Generation //當前的Old區(qū)內存分布
     capacity = 86507520 (82.5MB)
     used     = 0 (0.0MB)
     free     = 86507520 (82.5MB)
     0.0% used
  PS Perm Generation//當前的 “永生代” 內存分布
     capacity = 22020096 (21.0MB)
     used     = 2496528 (2.3808746337890625MB)
     free     = 19523568 (18.619125366210938MB)
     11.337498256138392% used  

  670 interned Strings occupying 43720 bytes.

可以很清楚的看到Java堆中各個區(qū)域目前的情況背传。

-histo

打印堆的對象統(tǒng)計呆瞻,包括對象數(shù)、內存大小等等 (因為在dump:live前會進行full gc径玖,如果帶上live則只統(tǒng)計活對象痴脾,因此不加live的堆大小要大于加live堆的大小 )

$ jmap -histo:live 28920 | more
 num     #instances         #bytes  class name
----------------------------------------------
   1:         83613       12012248  <constMethodKlass>
   2:         23868       11450280  [B
   3:         83613       10716064  <methodKlass>
   4:         76287       10412128  [C
   5:          8227        9021176  <constantPoolKlass>
   6:          8227        5830256  <instanceKlassKlass>
   7:          7031        5156480  <constantPoolCacheKlass>
   8:         73627        1767048  java.lang.String
   9:          2260        1348848  <methodDataKlass>
  10:          8856         849296  java.lang.Class
  ....

僅僅打印了前10行

xml class name是對象類型,說明如下:

B  byte
C  char
D  double
F  float
I  int
J  long
Z  boolean
[  數(shù)組梳星,如[I表示int[]
[L+類名 其他對象

-permstat

打印Java堆內存的永久保存區(qū)域的類加載器的智能統(tǒng)計信息赞赖。對于每個類加載器而言,它的名稱丰泊、活躍度薯定、地址始绍、父類加載器瞳购、它所加載的類的數(shù)量和大小都會被打印。此外亏推,包含的字符串數(shù)量和大小也會被打印学赛。

$ jmap -permstat 28920
  Attaching to process ID 28920, please wait...
  Debugger attached successfully.
  Server compiler detected.
  JVM version is 24.71-b01
  finding class loader instances ..done.
  computing per loader stat ..done.
  please wait.. computing liveness.liveness analysis may be inaccurate ...

  class_loader            classes bytes   parent_loader           alive?  type  
  <bootstrap>             3111    18154296          null          live    <internal>
  0x0000000600905cf8      1       1888    0x0000000600087f08      dead    sun/reflect/DelegatingClassLoader@0x00000007800500a0
  0x00000006008fcb48      1       1888    0x0000000600087f08      dead    sun/reflect/DelegatingClassLoader@0x00000007800500a0
  0x00000006016db798      0       0       0x00000006008d3fc0      dead    java/util/ResourceBundle$RBClassLoader@0x0000000780626ec0
  0x00000006008d6810      1       3056      null          dead    sun/reflect/DelegatingClassLoader@0x00000007800500a0

-F

強制模式。如果指定的pid沒有響應吞杭,請使用jmap -dump或jmap -histo選項盏浇。此模式下,不支持live子選項芽狗。

jhat

jhat(JVM Heap Analysis Tool)命令是與jmap搭配使用绢掰,用來分析jmap生成的dump,jhat內置了一個微型的HTTP/HTML服務器,生成dump的分析結果后滴劲,可以在瀏覽器中查看攻晒。在此要注意,一般不會直接在服務器上進行分析班挖,因為jhat是一個耗時并且耗費硬件資源的過程鲁捏,一般把服務器生成的dump文件復制到本地或其他機器上進行分析。

命令格式

jhat [dumpfile]

參數(shù)

  • -stack false|true 關閉對象分配調用棧跟蹤(tracking object allocation call stack)萧芙。 如果分配位置信息在堆轉儲中不可用. 則必須將此標志設置為 false. 默認值為 true.>
  • -refs false|true 關閉對象引用跟蹤(tracking of references to objects)给梅。 默認值為 true. 默認情況下, 返回的指針是指向其他特定對象的對象,如反向鏈接或輸入引用(referrers or incoming references), 會統(tǒng)計/計算堆中的所有對象。>
  • -port port-number 設置 jhat HTTP server 的端口號. 默認值 7000.>
  • -exclude exclude-file 指定對象查詢時需要排除的數(shù)據(jù)成員列表文件(a file that lists data members that should be excluded from the reachable objects query)双揪。 例如, 如果文件列列出了 java.lang.String.value , 那么當從某個特定對象 Object o 計算可達的對象列表時, 引用路徑涉及 java.lang.String.value 的都會被排除动羽。>
  • -baseline exclude-file 指定一個基準堆轉儲(baseline heap dump)。 在兩個 heap dumps 中有相同 object ID 的對象會被標記為不是新的(marked as not being new). 其他對象被標記為新的(new). 在比較兩個不同的堆轉儲時很有用.>
  • -debug int 設置 debug 級別. 0 表示不輸出調試信息盟榴。 值越大則表示輸出更詳細的 debug 信息.>
  • -version 啟動后只顯示版本信息就退出>
  • -J< flag > 因為 jhat 命令實際上會啟動一個JVM來執(zhí)行, 通過 -J 可以在啟動JVM時傳入一些啟動參數(shù). 例如, -J-Xmx512m 則指定運行 jhat 的Java虛擬機使用的最大堆內存為 512 MB. 如果需要使用多個JVM啟動參數(shù),則傳入多個 -Jxxxxxx.

示例

$ jhat -J-Xmx512m dump.hprof
  eading from dump.hprof...
  Dump file created Fri Mar 11 17:13:42 CST 2016
  Snapshot read, resolving...
  Resolving 271678 objects...
  Chasing references, expect 54 dots......................................................
  Eliminating duplicate references......................................................
  Snapshot resolved.
  Started HTTP server on port 7000
  Server is ready.

中間的-J-Xmx512m是在dump快照很大的情況下分配512M內存去啟動HTTP服務器曹质,運行完之后就可在瀏覽器打開Http://localhost:7000進行快照分析 堆快照分析主要在最后面的Heap Histogram里,里面根據(jù)class列出了dump的時候所有存活對象擎场。

分析同樣一個dump快照羽德,MAT需要的額外內存比jhat要小的多的多,所以建議使用MAT來進行分析迅办,當然也看個人偏好宅静。

分析

打開瀏覽器Http://localhost:7000,該頁面提供了幾個查詢功能可供使用:

All classes including platform
Show all members of the rootset
Show instance counts for all classes (including platform)
Show instance counts for all classes (excluding platform)
Show heap histogram
Show finalizer summary
Execute Object Query Language (OQL) query

一般查看堆異常情況主要看這個兩個部分: Show instance counts for all classes (excluding platform)站欺,平臺外的所有對象信息姨夹。如下圖:
image

Show heap histogram 以樹狀圖形式展示堆情況。如下圖:
image

具體排查時需要結合代碼矾策,觀察是否大量應該被回收的對象在一直被引用或者是否有占用內存特別大的對象無法被回收磷账。
一般情況,會down到客戶端用工具來分析

jstack

jstack用于生成java虛擬機當前時刻的線程快照贾虽。線程快照是當前java虛擬機內每一條線程正在執(zhí)行的方法堆棧的集合逃糟,生成線程快照的主要目的是定位線程出現(xiàn)長時間停頓的原因,如線程間死鎖蓬豁、死循環(huán)绰咽、請求外部資源導致的長時間等待等。 線程出現(xiàn)停頓的時候通過jstack來查看各個線程的調用堆棧地粪,就可以知道沒有響應的線程到底在后臺做什么事情取募,或者等待什么資源。 如果java程序崩潰生成core文件蟆技,jstack工具可以用來獲得core文件的java stack和native stack的信息玩敏,從而可以輕松地知道java程序是如何崩潰和在程序何處發(fā)生問題斗忌。另外,jstack工具還可以附屬到正在運行的java程序中旺聚,看到當時運行的java程序的java stack和native stack的信息, 如果現(xiàn)在運行的java程序呈現(xiàn)hung的狀態(tài)飞蹂,jstack是非常有用的。

命令格式

jstack [option] LVMID

option參數(shù)

  • -F : 當正常輸出請求不被響應時翻屈,強制輸出線程堆棧
  • -l : 除堆棧外陈哑,顯示關于鎖的附加信息
  • -m : 如果調用到本地方法的話,可以顯示C/C++的堆棧

示例

$ jstack -l 11494|more
2016-07-28 13:40:04
Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.71-b01 mixed mode):

"Attach Listener" daemon prio=10 tid=0x00007febb0002000 nid=0x6b6f waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"http-bio-8005-exec-2" daemon prio=10 tid=0x00007feb94028000 nid=0x7b8c waiting on condition [0x00007fea8f56e000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00000000cae09b80> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
        at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
        at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:104)
        at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:32)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
        - None
      .....

分析

這里有一篇文章解釋的很好 分析打印出的文件內容

jinfo

jinfo(JVM Configuration info)這個命令作用是實時查看和調整虛擬機運行參數(shù)伸眶。 之前的jps -v口令只能查看到顯示指定的參數(shù)惊窖,如果想要查看未被顯示指定的參數(shù)的值就要使用jinfo口令

命令格式

jinfo [option] [args] LVMID

option參數(shù)

  • -flag : 輸出指定args參數(shù)的值
  • -flags : 不需要args參數(shù),輸出所有JVM參數(shù)的值
  • -sysprops : 輸出系統(tǒng)屬性厘贼,等同于System.getProperties()

示例

$ jinfo -flag 11494
-XX:CMSInitiatingOccupancyFraction=80

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末界酒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嘴秸,更是在濱河造成了極大的恐慌毁欣,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岳掐,死亡現(xiàn)場離奇詭異凭疮,居然都是意外死亡,警方通過查閱死者的電腦和手機串述,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門执解,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纲酗,你說我怎么就攤上這事衰腌。” “怎么了觅赊?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵右蕊,是天一觀的道長。 經(jīng)常有香客問我吮螺,道長饶囚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任规脸,我火速辦了婚禮坯约,結果婚禮上熊咽,老公的妹妹穿的比我還像新娘莫鸭。我一直安慰自己,他們只是感情好横殴,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布被因。 她就那樣靜靜地躺著卿拴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪梨与。 梳的紋絲不亂的頭發(fā)上堕花,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機與錄音粥鞋,去河邊找鬼缘挽。 笑死,一個胖子當著我的面吹牛呻粹,可吹牛的內容都是我干的壕曼。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼等浊,長吁一口氣:“原來是場噩夢啊……” “哼腮郊!你這毒婦竟也來了?” 一聲冷哼從身側響起筹燕,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤轧飞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后撒踪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體过咬,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年制妄,在試婚紗的時候發(fā)現(xiàn)自己被綠了援奢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡忍捡,死狀恐怖集漾,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情砸脊,我是刑警寧澤具篇,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站凌埂,受9級特大地震影響驱显,放射性物質發(fā)生泄漏。R本人自食惡果不足惜瞳抓,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一埃疫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧孩哑,春花似錦栓霜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽销凑。三九已至,卻和暖如春仅炊,著一層夾襖步出監(jiān)牢的瞬間斗幼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工抚垄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蜕窿,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓呆馁,卻偏偏與公主長得像渠羞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子智哀,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內容