亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

《深入理解Java虛擬機(jī)》(四)虛擬機(jī)性能監(jiān)控與故障處理工具

gself / 1002人閱讀

摘要:虛擬機(jī)性能監(jiān)控與故障處理工具詳解概述本文參考的是周志明的深入理解虛擬機(jī)第四章,為了整理思路,簡(jiǎn)單記錄一下,方便后期查閱。虛擬機(jī)堆轉(zhuǎn)儲(chǔ)快照分析工具功能用于分析生成的。

虛擬機(jī)性能監(jiān)控與故障處理工具 詳解 4.1 概述

本文參考的是周志明的 《深入理解Java虛擬機(jī)》 第四章 ,為了整理思路,簡(jiǎn)單記錄一下,方便后期查閱。

JDK本身提供了很多方便的JVM性能調(diào)優(yōu)監(jiān)控工具,除了集成式的VisualVM和jConsole外,還有jps、jstack、jmap、jhat、jstat、hprof等小巧的工具,本文希望能起拋磚引玉之用,讓大家能開(kāi)始對(duì)JVM性能調(diào)優(yōu)的常用工具有所了解。

4.2 JDK的命令行工具
命令名稱 全稱 用途
jstat JVM Statistics Monitoring Tool 用于收集Hotspot虛擬機(jī)各方面的運(yùn)行數(shù)據(jù)
jps JVM Process Status Tool 顯示指定系統(tǒng)內(nèi)所有的HotSpot虛擬機(jī)進(jìn)程
jinfo Configuration Info for Java 顯示虛擬機(jī)配置信息
jmap JVM Memory Map 生成虛擬機(jī)的內(nèi)存轉(zhuǎn)儲(chǔ)快照,生成heapdump文件
jhat JVM Heap Dump Browser 用于分析heapdump文件,它會(huì)建立一個(gè)HTTP/HTML服務(wù)器,讓用戶在瀏覽器上查看分析結(jié)果
jstack JVM Stack Trace 顯示虛擬機(jī)的線程快照
4.2.1 jps:虛擬機(jī)進(jìn)程狀況工具
jps [options] [hostid]
-l : 輸出主類全名或jar路徑
-q : 只輸出LVMID
-m : 輸出JVM啟動(dòng)時(shí)傳遞給main()的參數(shù)
-v : 輸出JVM啟動(dòng)時(shí)顯示指定的JVM參數(shù)
$ jps -l
16256 sun.tools.jps.Jps
14904 org.jetbrains.jps.cmdline.Launcher
15016 com.ecej.esmart.gateway.service.impl.PengleiTest

功能:可以列出正在運(yùn)行的虛擬機(jī)進(jìn)程,并線上虛擬機(jī)執(zhí)行的主類名稱及其本地虛擬機(jī)唯一ID(LVMID);

對(duì)于本地虛擬機(jī)來(lái)說(shuō),LVMID和操作系統(tǒng)的進(jìn)程ID是一致的;

其他的工具通常都需要依賴jps獲取LVMID;

主要選項(xiàng):-q(只輸出LVMID)、-m(輸出傳給main函數(shù)的參數(shù))、-l(輸出主類的全名)、-v(輸出虛擬機(jī)啟動(dòng)JVM參數(shù));

4.2.2 jstat:虛擬機(jī)統(tǒng)計(jì)信息監(jiān)視工具

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

命令格式

$ jstat [option] LVMID [interval] [count]

參數(shù)

[option] : 操作參數(shù)

LVMID : 本地虛擬機(jī)進(jìn)程ID

[interval] : 連續(xù)輸出的時(shí)間間隔

[count] : 連續(xù)輸出的次數(shù)

option 參數(shù)總覽

選 ? ? ? 項(xiàng) 作 ? ? ? 用
-class 監(jiān)視類裝載、卸載數(shù)量、總空間以及類裝載所耗費(fèi)的時(shí)間
-gc 監(jiān)視Java堆狀況,包括Eden區(qū)、兩個(gè)Survivor區(qū)、、老年代、永久帶等的容量、已用空間、GC時(shí)間合計(jì)等信息
-gccapacity 監(jiān)視內(nèi)容基本與-gc相同,但輸出主要關(guān)注Java堆各個(gè)區(qū)域使用到的最大、最小空間
-gcutil 監(jiān)視內(nèi)容基本與-gc相同,但輸出主要關(guān)注已使用的空間占總空間的百分比
-gccause 與-gcutil功能一樣,但是會(huì)額外輸出導(dǎo)致上一次GC產(chǎn)生的原因
-gcnew 監(jiān)視新生代GC狀況
-gcnewcapacity 監(jiān)視內(nèi)容基本與-gcnew相同,但輸出主要關(guān)注使用到的最大、最小空間
-gcold 監(jiān)視老年代GC狀況
-gcoldcapacity 監(jiān)視內(nèi)容基本與-gcold相同,但輸出主要關(guān)注使用到的最大、最小空間
-gcpermcapacity 輸出永久代使用到的最大、最小空間
-compiler 輸出JIT編譯器編譯過(guò)的方法、耗時(shí)等信息
-printcompilation 輸出已經(jīng)被JIT編譯的方法

option 參數(shù)詳解

-class

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

$ jstat -class 14988
Loaded  Bytes  Unloaded  Bytes     Time
   577  1152.8        0     0.0       0.17

Loaded : 加載class的數(shù)量

Bytes : class字節(jié)大小

Unloaded : 未加載class的數(shù)量

Bytes : 未加載class的字節(jié)大小

Time : 加載時(shí)間

-compiler

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

$ jps -l -m
8657 org.apache.catalina.startup.Bootstrap start
12706 com.ecej.cust.service.run.Startup 60001
52132 sun.tools.jps.Jps -l -m
55671 customer.jar --server.port=8082 --log.home=/data/dubbo/logs/customer --log.level=info --log.stdout=0 ecej.ops.iswitch=1 --ecej.ops.port=80 --jmx.rmi.port=9991

$ jstat -compiler 55671
Compiled Failed Invalid   Time   FailedType FailedMethod
   13784      1       0   102.02          1 com/mysql/jdbc/AbandonedConnectionCleanupThread run

Compiled : 編譯數(shù)量

Failed : 編譯失敗數(shù)量

Invalid : 無(wú)效數(shù)量

Time : 編譯耗時(shí)

FailedType : 失敗類型

FailedMethod : 失敗的方法

-gc

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

$ jstat -gc 55671
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
512.0  512.0   0.0    0.0   1285632.0 56336.6   259584.0   61064.8   74416.0 72873.0 8368.0 8015.0    114    0.854  103    14.911   15.765

S0C:第一個(gè)幸存區(qū)的大小

S1C:第二個(gè)幸存區(qū)的大小

S0U:第一個(gè)幸存區(qū)的使用大小

S1U:第二個(gè)幸存區(qū)的使用大小

EC:伊甸園區(qū)的大小

EU:伊甸園區(qū)的使用大小

OC:老年代大小

OU:老年代使用大小

MC:方法區(qū)大小

MU:方法區(qū)使用大小

CCSC:壓縮類空間大小

CCSU:壓縮類空間使用大小

YGC:年輕代垃圾回收次數(shù)

YGCT:年輕代垃圾回收消耗時(shí)間

FGC:老年代垃圾回收次數(shù)

FGCT:老年代垃圾回收消耗時(shí)間

GCT:垃圾回收消耗總時(shí)間

$ jstat -gc 55671 2000 20

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

-gccapacity

同-gc,不過(guò)還會(huì)輸出Java堆各區(qū)域使用到的最大、最小空間

$ jstat -gccapacity 55671
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC 
 84992.0 1360384.0 1287168.0  512.0  512.0 1285632.0   171008.0  2721280.0   259584.0   259584.0      0.0 1116160.0  74416.0      0.0 1048576.0   8368.0    114   103

NGCMN:新生代最小容量

NGCMX:新生代最大容量

NGC:當(dāng)前新生代容量

S0C:第一個(gè)幸存區(qū)大小

S1C:第二個(gè)幸存區(qū)的大小

EC:伊甸園區(qū)的大小

OGCMN:老年代最小容量

OGCMX:老年代最大容量

OGC:當(dāng)前老年代大小

OC:當(dāng)前老年代大小

MCMN:最小元數(shù)據(jù)容量

MCMX:最大元數(shù)據(jù)容量

MC:當(dāng)前元數(shù)據(jù)空間大小

CCSMN:最小壓縮類空間大小

CCSMX:最大壓縮類空間大小

CCSC:當(dāng)前壓縮類空間大小

YGC:年輕代gc次數(shù)

FGC:老年代GC次數(shù) - NGCMN:新生代最小容量

NGCMX:新生代最大容量

NGC:當(dāng)前新生代容量

S0C:第一個(gè)幸存區(qū)大小

S1C:第二個(gè)幸存區(qū)的大小

EC:伊甸園區(qū)的大小

OGCMN:老年代最小容量

OGCMX:老年代最大容量

OGC:當(dāng)前老年代大小

OC:當(dāng)前老年代大小

MCMN:最小元數(shù)據(jù)容量

MCMX:最大元數(shù)據(jù)容量

MC:當(dāng)前元數(shù)據(jù)空間大小

CCSMN:最小壓縮類空間大小

CCSMX:最大壓縮類空間大小

CCSC:當(dāng)前壓縮類空間大小

YGC:年輕代gc次數(shù)

FGC:老年代GC次數(shù)

-gcutil

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

$ jstat -gcutil 55671
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00   0.00   6.25  23.52  97.93  95.78    114    0.854   103   14.911   15.765

S0 -Heap上的Survivor space 0區(qū)已使用空間的百分比

S1 -Heap上的Survivor space 1區(qū)已使用空間的百分比

E -Heap上Eden space區(qū)已使用空間的百分比

O -Heap上的Old space區(qū)已使用空間的百分比

P -Perm space區(qū)已使用空間的百分比

YGC -從應(yīng)用程序啟動(dòng)到采樣時(shí)發(fā)生Yang GC 的次數(shù)

YGCT -從應(yīng)用程序啟動(dòng)到采樣時(shí)Yang GC所用的時(shí)間【單位秒】

FGC -從應(yīng)用程序啟動(dòng)到采樣時(shí)Full GC的次數(shù)

FGCT -從應(yīng)用程序啟動(dòng)到采樣時(shí)Full GC所用的時(shí)間

GCT -從應(yīng)用程序啟動(dòng)到采樣時(shí)用于垃圾回收的總時(shí)間【單位秒】

-gcnew

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

$ jstat -gcnew 55671
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT  
 512.0  512.0    0.0    0.0 15  15  512.0 1285632.0 100094.5    114    0.854

S0C:第一個(gè)幸存區(qū)大小

S1C:第二個(gè)幸存區(qū)的大小

S0U:第一個(gè)幸存區(qū)的使用大小

S1U:第二個(gè)幸存區(qū)的使用大小

TT:對(duì)象在新生代存活的次數(shù)

MTT:對(duì)象在新生代存活的最大次數(shù)

DSS:期望的幸存區(qū)大小

EC:伊甸園區(qū)的大小

EU:伊甸園區(qū)的使用大小

YGC:年輕代垃圾回收次數(shù)

YGCT:年輕代垃圾回收消耗時(shí)間

-gcnewcapacity

新生代與其相應(yīng)的內(nèi)存空間的統(tǒng)計(jì)

$ jstat -gcnewcapacity  55671
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC 
   84992.0  1360384.0  1287168.0 453120.0    512.0 453120.0    512.0  1359360.0  1285632.0   114   103

NGCMN:新生代最小容量

NGCMX:新生代最大容量

NGC:當(dāng)前新生代容量

S0CMX:最大幸存1區(qū)大小

S0C:當(dāng)前幸存1區(qū)大小

S1CMX:最大幸存2區(qū)大小

S1C:當(dāng)前幸存2區(qū)大小

ECMX:最大伊甸園區(qū)大小

EC:當(dāng)前伊甸園區(qū)大小

YGC:年輕代垃圾回收次數(shù)

FGC:老年代回收次數(shù)

-gcold

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

$  jstat -gcold 55671
   MC       MU      CCSC     CCSU       OC          OU       YGC    FGC    FGCT     GCT   
 74416.0  72873.0   8368.0   8015.0    259584.0     61064.8    114   103   14.911   15.765

MC:方法區(qū)大小

MU:方法區(qū)使用大小

CCSC:壓縮類空間大小

CCSU:壓縮類空間使用大小

OC:老年代大小

OU:老年代使用大小

YGC:年輕代垃圾回收次數(shù)

FGC:老年代垃圾回收次數(shù)

FGCT:老年代垃圾回收消耗時(shí)間

GCT:垃圾回收消耗總時(shí)間

-gcoldcapacity

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

$ jstat -gcoldcapacity 55671
   OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT     GCT   
   171008.0   2721280.0    259584.0    259584.0   116   105   15.170   16.033

OGCMN:老年代最小容量

OGCMX:老年代最大容量

OGC:當(dāng)前老年代大小

OC:老年代大小

YGC:年輕代垃圾回收次數(shù)

FGC:老年代垃圾回收次數(shù)

FGCT:老年代垃圾回收消耗時(shí)間

GCT:垃圾回收消耗總時(shí)間

-gcpermcapacity

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

在 JDK 8 刪除永久代
JDK 8 Java永久代去哪兒了
在Hotspot中的永久代碼的內(nèi)容的一部分移動(dòng)到Java堆中,其余部分移動(dòng)到本地內(nèi)存
$ 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)計(jì)

$ jstat -printcompilation 55671
Compiled  Size  Type Method
   13785    123    1 java/io/DataOutputStream write

Compiled:被執(zhí)行的編譯任務(wù)的數(shù)量

Size:方法字節(jié)碼的字節(jié)數(shù)

Type:編譯類型

Method:編譯方法的類名和方法名。類名使用"/" 代替 "." 作為空間分隔符. 方法名是給出類的方法名. 格式是一致于HotSpot - XX:+PrintComplation 選項(xiàng)

4.2.3 jinfo:Java配置信息工具

jinfo(JVM Configuration info)這個(gè)命令作用是實(shí)時(shí)查看和調(diào)整虛擬機(jī)運(yùn)行參數(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 -flags 55671
Attaching to process ID 55671, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.65-b01
Non-default VM flags: -XX:CICompilerCount=4 -XX:InitialHeapSize=262144000 -XX:MaxHeapSize=4179623936 -XX:MaxNewSize=1393033216 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=87031808 -XX:OldSize=175112192 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC 
Command line:  
4.2.4 jmap:Java內(nèi)存映像工具

功能:用于生成堆轉(zhuǎn)儲(chǔ)快照(一般稱為heapdump或dump文件)

其他可生成 heapdump 的方式:使用參數(shù)-XX:+HeapDumpOnOutOfMemoryError使用參數(shù)-XX:+HeapDumpOnCtrlBreak然后使用 Ctrl+Break 生成;Linux系統(tǒng)使用kill -3生成

另外它還可以查詢 finalize 執(zhí)行隊(duì)列、Java堆和永久代的詳細(xì)信息

命令格式

jmap [option] LVMID

option參數(shù)

dump : 生成堆轉(zhuǎn)儲(chǔ)快照

finalizerinfo : 顯示在F-Queue隊(duì)列等待Finalizer線程執(zhí)行finalizer方法的對(duì)象

heap : 顯示Java堆詳細(xì)信息

histo : 顯示堆中對(duì)象的統(tǒng)計(jì)信息

permstat : to print permanent generation statistics

F : 當(dāng)-dump沒(méi)有響應(yīng)時(shí),強(qiáng)制生成dump快照

-dump
常用格式

-dump::live,format=b,file= pid 

dump堆到文件,format指定輸出格式,live指明是活著的對(duì)象,file指定文件名

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

penglei.hprof這個(gè)后綴是為了后續(xù)可以直接用MAT(Memory Anlysis Tool)打開(kāi)。

-finalizerinfo

打印等待回收對(duì)象的信息

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

可以看到當(dāng)前F-QUEUE隊(duì)列中并沒(méi)有等待Finalizer線程執(zhí)行finalizer方法的對(duì)象。

-heap

打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情況,可以用此來(lái)判斷內(nèi)存目前的使用情況以及垃圾回收情況

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

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

Heap Configuration://堆內(nèi)存初始化配置
   MinHeapFreeRatio         = 0 //對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:MinHeapFreeRatio設(shè)置JVM堆最小空閑比率(default 40)
   MaxHeapFreeRatio         = 100 //對(duì)應(yīng)jvm啟動(dòng)參數(shù) -XX:MaxHeapFreeRatio設(shè)置JVM堆最大空閑比率(default 70)
   MaxHeapSize              = 4179623936 (3986.0MB)//對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:MaxHeapSize=設(shè)置JVM堆的最大大小
   NewSize                  = 87031808 (83.0MB)//對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:NewSize=設(shè)置JVM堆的‘新生代’的默認(rèn)大小
   MaxNewSize               = 1393033216 (1328.5MB)//對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:MaxNewSize=設(shè)置JVM堆的‘新生代’的最大大小
   OldSize                  = 175112192 (167.0MB)//對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:OldSize=:設(shè)置JVM堆的‘老生代’的大小
   NewRatio                 = 2//對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
   SurvivorRatio            = 8//對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:SurvivorRatio=設(shè)置年輕代中Eden區(qū)與Survivor區(qū)的大小比值 
   MetaspaceSize            = 21807104 (20.796875MB)//對(duì)應(yīng)jvm啟動(dòng)參數(shù)--XX:MetaspaceSize  是分配給類元數(shù)據(jù)空間
   CompressedClassSpaceSize = 1073741824 (1024.0MB)//對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:CompressedClassSpaceSize 默認(rèn)也有1G,我能猜到metaspace的作者不希望出現(xiàn)它相關(guān)的OOM問(wèn)題
   MaxMetaspaceSize         = 17592186044415 MB//對(duì)應(yīng)jvm啟動(dòng)參數(shù)XX:MaxMetaspaceSize設(shè)置最大的本地內(nèi)存類員工間可用于垃圾回收。默認(rèn)沒(méi)有限制,也就是說(shuō)你的系統(tǒng)內(nèi)存上限是多少它就是多少如果沒(méi)有指定的話,元空間會(huì)根據(jù)應(yīng)用程序運(yùn)行時(shí)的需要?jiǎng)討B(tài)地調(diào)整大小。
   G1HeapRegionSize         = 0 (0.0MB)//當(dāng)使用G1收集器時(shí),設(shè)置java堆被分割的大小。這個(gè)大小范圍在1M到32M之間

Heap Usage://堆內(nèi)存使用情況
PS Young Generation
Eden Space://Eden區(qū)內(nèi)存分布
   capacity = 1317011456 (1256.0MB)//Eden區(qū)總?cè)萘?   used     = 46816712 (44.64789581298828MB)//Eden區(qū)已使用
   free     = 1270194744 (1211.3521041870117MB)//Eden區(qū)剩余容量
   3.554768774919449% used //Eden區(qū)使用比率
From Space://其中一個(gè)Survivor區(qū)的內(nèi)存分布
   capacity = 524288 (0.5MB)
   used     = 0 (0.0MB)
   free     = 524288 (0.5MB)
   0.0% used
To Space://另一個(gè)Survivor區(qū)的內(nèi)存分布
   capacity = 524288 (0.5MB)
   used     = 0 (0.0MB)
   free     = 524288 (0.5MB)
   0.0% used
PS Old Generation//當(dāng)前的Old區(qū)內(nèi)存分布
   capacity = 312999936 (298.5MB)
   used     = 62510688 (59.614837646484375MB)
   free     = 250489248 (238.88516235351562MB)
   19.971469898319725% used

32160 interned Strings occupying 3634120 bytes.
[publish@YZ-PTEST-CUS-WEB-01 ~]$ 

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

4.2.5 jhat:虛擬機(jī)堆轉(zhuǎn)儲(chǔ)快照分析工具

功能:用于分析jmap生成的heapdump。其內(nèi)置了一個(gè)微型的HTTP服務(wù)器,可以在瀏覽器查看分析結(jié)果;

實(shí)際很少用jhat,主要有兩個(gè)原因:一是分析工程會(huì)耗用服務(wù)器資源;功能相對(duì)BisualVM、IBM HeapAnalyzer較為簡(jiǎn)陋;

命令格式

jhat [dumpfile]

參數(shù)

-stack false|true

關(guān)閉對(duì)象分配調(diào)用棧跟蹤(tracking object allocation call stack)。 如果分配位置信息在堆轉(zhuǎn)儲(chǔ)中不可用. 則必須將此標(biāo)志設(shè)置為 false. 默認(rèn)值為 true.>

-refs false|true

關(guān)閉對(duì)象引用跟蹤(tracking of references to objects)。 默認(rèn)值為 true. 默認(rèn)情況下, 返回的指針是指向其他特定對(duì)象的對(duì)象,如反向鏈接或輸入引用(referrers or incoming references), 會(huì)統(tǒng)計(jì)/計(jì)算堆中的所有對(duì)象。>

-port port-number

設(shè)置 jhat HTTP server 的端口號(hào). 默認(rèn)值 7000.>

-exclude exclude-file

指定對(duì)象查詢時(shí)需要排除的數(shù)據(jù)成員列表文件(a file that lists data members that should be excluded from the reachable objects query)。 例如, 如果文件列列出了 java.lang.String.value , 那么當(dāng)從某個(gè)特定對(duì)象 Object o 計(jì)算可達(dá)的對(duì)象列表時(shí), 引用路徑涉及 java.lang.String.value 的都會(huì)被排除。>

-baseline exclude-file

指定一個(gè)基準(zhǔn)堆轉(zhuǎn)儲(chǔ)(baseline heap dump)。 在兩個(gè) heap dumps 中有相同 object ID 的對(duì)象會(huì)被標(biāo)記為不是新的(marked as not being new). 其他對(duì)象被標(biāo)記為新的(new). 在比較兩個(gè)不同的堆轉(zhuǎn)儲(chǔ)時(shí)很有用.>

-debug int

設(shè)置 debug 級(jí)別. 0 表示不輸出調(diào)試信息。 值越大則表示輸出更詳細(xì)的 debug 信息.>

-version

啟動(dòng)后只顯示版本信息就退出>

-J< flag >

因?yàn)?jhat 命令實(shí)際上會(huì)啟動(dòng)一個(gè)JVM來(lái)執(zhí)行, 通過(guò) -J 可以在啟動(dòng)JVM時(shí)傳入一些啟動(dòng)參數(shù). 例如, -J-Xmx512m 則指定運(yùn)行 jhat 的Java虛擬機(jī)使用的最大堆內(nèi)存為 512 MB. 如果需要使用多個(gè)JVM啟動(dòng)參數(shù),則傳入多個(gè) -Jxxxxxx.

$ jhat -J-Xmx512m dump.hprof
Reading from dump.hprof...
Dump file created Mon Jul 31 23:46:31 CST 2017
Snapshot read, resolving...
Resolving 1285013 objects...
Chasing references, expect 257 dots.................................................................................................................................................................................................................................................................
Eliminating duplicate references.................................................................................................................................................................................................................................................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

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

4.2.6 jstack:Java堆棧跟蹤工具

jstack用于生成java虛擬機(jī)當(dāng)前時(shí)刻的線程快照。線程快照是當(dāng)前java虛擬機(jī)內(nèi)每一條線程正在執(zhí)行的方法堆棧的集合,生成線程快照的主要目的是定位線程出現(xiàn)長(zhǎng)時(shí)間停頓的原因,如線程間死鎖、死循環(huán)、請(qǐng)求外部資源導(dǎo)致的長(zhǎng)時(shí)間等待等。 線程出現(xiàn)停頓的時(shí)候通過(guò)jstack來(lái)查看各個(gè)線程的調(diào)用堆棧,就可以知道沒(méi)有響應(yīng)的線程到底在后臺(tái)做什么事情,或者等待什么資源。 如果java程序崩潰生成core文件,jstack工具可以用來(lái)獲得core文件的java stack和native stack的信息,從而可以輕松地知道java程序是如何崩潰和在程序何處發(fā)生問(wèn)題。另外,jstack工具還可以附屬到正在運(yùn)行的java程序中,看到當(dāng)時(shí)運(yùn)行的java程序的java stack和native stack的信息, 如果現(xiàn)在運(yùn)行的java程序呈現(xiàn)hung的狀態(tài),jstack是非常有用的。

命令格式

jstack [option] LVMID

option參數(shù)

-F : 當(dāng)正常輸出請(qǐng)求不被響應(yīng)時(shí),強(qiáng)制輸出線程堆棧

-l : 除堆棧外,顯示關(guān)于鎖的附加信息

-m : 如果調(diào)用到本地方法的話,可以顯示C/C++的堆棧

$ jstack -l 55671|more
2017-08-01 00:20:58
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.65-b01 mixed mode):

"DubboClientHandler-10.32.32.31:7070-thread-6208" #13942 daemon prio=5 os_prio=0 tid=0x00007f4a40002800 nid=0xd5f1 waiting on condition [0x00007f4af0b5f000]
   java.lang.Thread.State: TIMED_WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000006ca25a240> (a java.util.concurrent.SynchronousQueue$TransferStack)
    at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
    at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:460)
    at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362)
    at java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:941)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1066)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
    - None

"DubboClientHandler-10.32.32.54:60036-thread-1219" #13941 daemon prio=5 os_prio=0 tid=0x00007f4a640f4800 nid=0xd5ec waiting on condition [0x00007f4ae818f000]
   java.lang.Thread.State: TIMED_WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000006ca76a638> (a java.util.concurrent.SynchronousQueue$TransferStack)
    at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
    at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:460)
    at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362)
    at java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:941)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1066)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
    - None
--More--

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

《深入理解Java虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐_周志明.高清掃描版.pdf》

下載地址:鏈接:http://pan.baidu.com/s/1miBQCBY 密碼:9kbn

推薦閱讀

《深入理解Java虛擬機(jī)》(一)Java虛擬機(jī)發(fā)展史

《深入理解Java虛擬機(jī)》(二)Java虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)

《深入理解Java虛擬機(jī)》(三)垃圾收集器與內(nèi)存分配策略

《深入理解Java虛擬機(jī)》(四)虛擬機(jī)性能監(jiān)控與故障處理工具

《深入理解Java虛擬機(jī)》(五)JVM調(diào)優(yōu) - 工具

《深入理解Java虛擬機(jī)》(六)堆內(nèi)存使用分析,GC 日志解讀

參考

本文參考-純潔的微笑-jvm調(diào)優(yōu)-命令篇

命令全部都自己試驗(yàn)了一遍

參考-純潔的微笑-jvm調(diào)優(yōu)-命令篇

Contact

作者:鵬磊

出處:http://www.ymq.io

Email:admin@souyunku.com

版權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)注明出處

Wechat:關(guān)注公眾號(hào),搜云庫(kù),專注于開(kāi)發(fā)技術(shù)的研究與知識(shí)分享

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/67516.html

相關(guān)文章

  • 深入理解虛擬機(jī)虛擬機(jī)性能監(jiān)控故障處理工具

    摘要:監(jiān)控和故障處理工具顯示指定系統(tǒng)內(nèi)所有的虛擬機(jī)進(jìn)程用于收集虛擬機(jī)各方面的運(yùn)行數(shù)據(jù)。的常用功能選項(xiàng)測(cè)試上面輸出了我正在運(yùn)行程序的包名下的類名虛擬機(jī)統(tǒng)計(jì)信息監(jiān)視工具使用于監(jiān)視虛擬機(jī)各種運(yùn)行狀態(tài)信息的命令行工具。 《深入理解Java虛擬機(jī):JVM高級(jí)特性與最佳實(shí)踐(第二版》讀書筆記與常見(jiàn)面試題總結(jié) 本節(jié)常見(jiàn)面試題(推薦帶著問(wèn)題閱讀,問(wèn)題答案在文中都有提到): JVM調(diào)優(yōu)的常見(jiàn)命令行工具有哪些?...

    jas0n 評(píng)論0 收藏0
  • 深入理解Java虛擬機(jī)第3版》垃圾收集器內(nèi)存分配策略、虛擬機(jī)性能監(jiān)控故障處理工具

    摘要:目錄往期博客課堂篇初識(shí)常量池簡(jiǎn)單理解字符串常量池靜態(tài)常量池大整型常量池為什么要了解垃圾收集和內(nèi)存分配如何判斷對(duì)象已死引用計(jì)數(shù)算法可達(dá)性分析算法之后引用的擴(kuò)充回收方法區(qū)垃圾收集算法分代收集理論標(biāo)記清除標(biāo)記復(fù)制標(biāo)記整理對(duì)象分 ...

    Kerr1Gan 評(píng)論0 收藏0
  • 深入理解Java虛擬機(jī)》(一)Java虛擬機(jī)發(fā)展史

    摘要:虛擬機(jī)發(fā)展史注本文大部分摘自深入理解虛擬機(jī)第二版作為一名開(kāi)發(fā)人員,不能局限于語(yǔ)言規(guī)范,更需要對(duì)虛擬機(jī)規(guī)范有所了解。虛擬機(jī)規(guī)范有多種實(shí)現(xiàn),其中是和中所帶的虛擬機(jī),也是目前使用范圍最廣的虛擬機(jī)。世界第一款商用虛擬機(jī)。號(hào)稱世界上最快的虛擬機(jī)。 Java虛擬機(jī)發(fā)展史 注:本文大部分摘自《深入理解Java虛擬機(jī)(第二版)》 作為一名Java開(kāi)發(fā)人員,不能局限于Java語(yǔ)言規(guī)范,更需要對(duì)Java虛...

    張春雷 評(píng)論0 收藏0
  • 學(xué)習(xí)JVM必看書籍

    學(xué)習(xí)JVM的相關(guān)資料 《深入理解Java虛擬機(jī)——JVM高級(jí)特性與最佳實(shí)踐(第2版)》 showImg(https://segmentfault.com/img/bVbsqF5?w=200&h=200); 基于最新JDK1.7,圍繞內(nèi)存管理、執(zhí)行子系統(tǒng)、程序編譯與優(yōu)化、高效并發(fā)等核心主題對(duì)JVM進(jìn)行全面而深入的分析,深刻揭示JVM的工作原理。以實(shí)踐為導(dǎo)向,通過(guò)大量與實(shí)際生產(chǎn)環(huán)境相結(jié)合的案例展示了解...

    shaonbean 評(píng)論0 收藏0
  • 深入理解Java虛擬機(jī)腦圖

    摘要:第二章內(nèi)存區(qū)域與內(nèi)存溢出異常第三章垃圾收集器與內(nèi)存分配策略第四章虛擬機(jī)性能監(jiān)控與故障處理工具第六章類文件結(jié)構(gòu)第七章虛擬機(jī)類加載機(jī)制第八章虛擬機(jī)字節(jié)碼執(zhí)行引擎第四部分程序編譯與代碼優(yōu)化第十二章內(nèi)存模型與線程 第二章 Java內(nèi)存區(qū)域與內(nèi)存溢出異常、第三章 垃圾收集器與內(nèi)存分配策略、第四章 虛擬機(jī)性能監(jiān)控與故障處理工具 第六章 類文件結(jié)構(gòu) 第七章 虛擬機(jī)類加載機(jī)制 第八章 虛擬機(jī)字節(jié)碼執(zhí)...

    Moxmi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

gself

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<