JVM系列(四):jvm調(diào)優(yōu)-命令篇

運(yùn)用jvm自帶的命令可以方便的在生產(chǎn)監(jiān)控和打印堆棧的日志信息幫忙我們來定位問題湃累!雖然jvm調(diào)優(yōu)成熟的工具已經(jīng)有很多:jconsole窄陡、大名鼎鼎的VisualVM,IBM的Memory Analyzer等等猜拾,但是在生產(chǎn)環(huán)境出現(xiàn)問題的時(shí)候府适,一方面工具的使用會(huì)有所限制,另一方面喜歡裝X的我們肺樟,總喜歡在出現(xiàn)問題的時(shí)候在終端輸入一些命令來解決檐春。所有的工具幾乎都是依賴于jdk的接口和底層的這些命令,研究這些命令的使用也讓我們更能了解jvm構(gòu)成和特性么伯。

Sun JDK監(jiān)控和故障處理命令有jps疟暖、jstatjmap田柔、jhat俐巴、jstackjinfo硬爆,下面做一一介紹欣舵。

jps

JVM Process Status Tool,顯示指定系統(tǒng)內(nèi)所有的HotSpot虛擬機(jī)進(jìn)程缀磕。

命令格式

jps [options] [hostid]

option參數(shù)

  • -l : 輸出主類全名或jar路徑
  • -q : 只輸出LVMID
  • -m : 輸出JVM啟動(dòng)時(shí)傳遞給main()的參數(shù)
  • -v : 輸出JVM啟動(dòng)時(shí)顯示指定的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)視虛擬機(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ù)總覽

Option Displays…
class class loader的行為統(tǒng)計(jì)。Statistics on the behavior of the class loader.
compiler HotSpt JIT編譯器行為統(tǒng)計(jì)凿傅。Statistics of the behavior of the HotSpot Just-in-Time compiler.
gc 垃圾回收堆的行為統(tǒng)計(jì)缠犀。Statistics of the behavior of the garbage collected heap.
gccapacity 各個(gè)垃圾回收代容量(young,old,perm)和他們相應(yīng)的空間統(tǒng)計(jì)。Statistics of the capacities of the generations and their corresponding spaces.
gcutil 垃圾回收統(tǒng)計(jì)概述聪舒。Summary of garbage collection statistics.
gccause 垃圾收集統(tǒng)計(jì)概述(同-gcutil)夭坪,附加最近兩次垃圾回收事件的原因。Summary of garbage collection statistics (same as -gcutil), with the cause of the last and
gcnew 新生代行為統(tǒng)計(jì)过椎。Statistics of the behavior of the new generation.
gcnewcapacity 新生代與其相應(yīng)的內(nèi)存空間的統(tǒng)計(jì)室梅。Statistics of the sizes of the new generations and its corresponding spaces.
gcold 年老代和永生代行為統(tǒng)計(jì)。Statistics of the behavior of the old and permanent generations.
gcoldcapacity 年老代行為統(tǒng)計(jì)。Statistics of the sizes of the old generation.
gcpermcapacity 永生代行為統(tǒng)計(jì)亡鼠。Statistics of the sizes of the permanent generation.
printcompilation HotSpot編譯方法統(tǒng)計(jì)赏殃。HotSpot compilation method statistics.

option 參數(shù)詳解

-class

監(jiān)視類裝載、卸載數(shù)量间涵、總空間以及耗費(fèi)的時(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 : 加載時(shí)間
-compiler

輸出JIT編譯過的方法數(shù)量耗時(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 : 編譯耗時(shí)
  • FailedType : 失敗類型
  • FailedMethod : 失敗方法的全限定名
-gc

垃圾回收堆的行為統(tǒng)計(jì)

$ 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 總?cè)萘咳嗜龋琔即Used 已使用的容量

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

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

-gccapacity

同-gc勾哩,不過還會(huì)輸出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:當(dāng)前年老代的容量 (KB)
  • OC:當(dāng)前年老代的空間 (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)計(jì)概述(同-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:當(dāng)前垃圾回收的原因
-gcnew

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

$ 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

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

$ 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:當(dāng)前年輕代的容量 (KB)
  • S0CMX:最大的S0空間 (KB)
  • S0C:當(dāng)前S0空間 (KB)
  • ECMX:最大eden空間 (KB)
  • EC:當(dāng)前eden空間 (KB)
-gcold

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

$ 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)計(jì)舊生代的大小和空間

$ 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)計(jì)

$ 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 28920
    Compiled  Size  Type Method
    1291      78     1    java/util/ArrayList indexOf
  • Compiled:被執(zhí)行的編譯任務(wù)的數(shù)量
  • Size:方法字節(jié)碼的字節(jié)數(shù)
  • Type:編譯類型
  • Method:編譯方法的類名和方法名迅矛。類名使用”/” 代替 “.” 作為空間分隔符. 方法名是給出類的方法名. 格式是一致于HotSpot - XX:+PrintComplation 選項(xiàng)

jmap

jmap(JVM Memory Map)命令用于生成heap dump文件,如果不使用這個(gè)命令潜叛,還可以使用-XX:+HeapDumpOnOutOfMemoryError參數(shù)來讓虛擬機(jī)出現(xiàn)OOM的時(shí)候自動(dòng)生成dump文件秽褒。 jmap不僅能生成dump文件,還可以查詢finalize執(zhí)行隊(duì)列威兜、Java堆和永久代的詳細(xì)信息销斟,如當(dāng)前使用率、當(dāng)前使用的是哪種收集器等椒舵。

命令格式

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沒有響應(yīng)時(shí)蚂踊,強(qiáng)制生成dump快照

示例

-dump

常用格式

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

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

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

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

-finalizerinfo

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

$ 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

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

-heap

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

$ 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: //堆內(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      = 2082471936 (1986.0MB) //對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:MaxHeapSize=設(shè)置JVM堆的最大大小
     NewSize          = 1310720 (1.25MB)//對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:NewSize=設(shè)置JVM堆的‘新生代’的默認(rèn)大小
     MaxNewSize       = 17592186044415 MB//對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:MaxNewSize=設(shè)置JVM堆的‘新生代’的最大大小
     OldSize          = 5439488 (5.1875MB)//對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:OldSize=<value>:設(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ū)的大小比值 
     PermSize         = 21757952 (20.75MB)  //對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:PermSize=<value>:設(shè)置JVM堆的‘永生代’的初始大小
     MaxPermSize      = 85983232 (82.0MB)//對(duì)應(yīng)jvm啟動(dòng)參數(shù)-XX:MaxPermSize=<value>:設(shè)置JVM堆的‘永生代’的最大大小
     G1HeapRegionSize = 0 (0.0MB)  

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

  670 interned Strings occupying 43720 bytes.

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

-histo

打印堆的對(duì)象統(tǒng)計(jì),包括對(duì)象數(shù)担败、內(nèi)存大小等等 (因?yàn)樵赿ump:live前會(huì)進(jìn)行full gc昔穴,如果帶上live則只統(tǒng)計(jì)活對(duì)象,因此不加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行

class name是對(duì)象類型提前,說明如下:

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

打印Java堆內(nèi)存的永久保存區(qū)域的類加載器的智能統(tǒng)計(jì)信息。對(duì)于每個(gè)類加載器而言狈网,它的名稱宙搬、活躍度笨腥、地址、父類加載器勇垛、它所加載的類的數(shù)量和大小都會(huì)被打印脖母。此外,包含的字符串?dāng)?shù)量和大小也會(huì)被打印闲孤。

$ 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

強(qiáng)制模式谆级。如果指定的pid沒有響應(yīng),請(qǐng)使用jmap -dump或jmap -histo選項(xiàng)讼积。此模式下肥照,不支持live子選項(xiàng)。

jhat

jhat(JVM Heap Analysis Tool)命令是與jmap搭配使用勤众,用來分析jmap生成的dump舆绎,jhat內(nèi)置了一個(gè)微型的HTTP/HTML服務(wù)器,生成dump的分析結(jié)果后决摧,可以在瀏覽器中查看亿蒸。在此要注意凑兰,一般不會(huì)直接在服務(wù)器上進(jìn)行分析掌桩,因?yàn)閖hat是一個(gè)耗時(shí)并且耗費(fèi)硬件資源的過程,一般把服務(wù)器生成的dump文件復(fù)制到本地或其他機(jī)器上進(jì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來執(zhí)行滨砍,通過 -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
  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內(nèi)存去啟動(dòng)HTTP服務(wù)器他膳,運(yùn)行完之后就可在瀏覽器打開http://localhost:7000進(jìn)行快照分析响逢。堆快照分析主要在最后面的Heap Histogram里,里面根據(jù)class列出了dump的時(shí)候所有存活對(duì)象棕孙。

分析同樣一個(gè)dump快照舔亭,MAT需要的額外內(nèi)存比jhat要小的多的多,所以建議使用MAT來進(jìn)行分析蟀俊,當(dāng)然也看個(gè)人偏好钦铺。

分析

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

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

一般查看堆異常情況主要看這個(gè)兩個(gè)部分: Show instance counts for all classes (excluding platform)肢预,平臺(tái)外的所有對(duì)象信息矛洞。如下圖:


All Classes (excluding platform)

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


Heap Histogram

具體排查時(shí)需要結(jié)合代碼烫映,觀察是否大量應(yīng)該被回收的對(duì)象在一直被引用或者是否有占用內(nèi)存特別大的對(duì)象無法被回收沼本。
一般情況,會(huì)下載到客戶端用工具來分析

jstack

jstack用于生成java虛擬機(jī)當(dāng)前時(shí)刻的線程快照锭沟。線程快照是當(dāng)前java虛擬機(jī)內(nèi)每一條線程正在執(zhí)行的方法堆棧的集合抽兆,生成線程快照的主要目的是定位線程出現(xiàn)長時(shí)間停頓的原因,如線程間死鎖族淮、死循環(huán)辫红、請(qǐng)求外部資源導(dǎo)致的長時(shí)間等待等。 線程出現(xiàn)停頓的時(shí)候通過jstack來查看各個(gè)線程的調(diào)用堆棧瞧筛,就可以知道沒有響應(yīng)的線程到底在后臺(tái)做什么事情厉熟,或者等待什么資源。 如果java程序崩潰生成core文件较幌,jstack工具可以用來獲得core文件的java stack和native stack的信息揍瑟,從而可以輕松地知道java程序是如何崩潰和在程序何處發(fā)生問題。另外乍炉,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 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
      .....

分析

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

jinfo

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 -flag 11494
-XX:CMSInitiatingOccupancyFraction=80
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末等舔,一起剝皮案震驚了整個(gè)濱河市骚灸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌慌植,老刑警劉巖甚牲,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蝶柿,居然都是意外死亡丈钙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門只锭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來著恩,“玉大人院尔,你說我怎么就攤上這事蜻展。” “怎么了邀摆?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵纵顾,是天一觀的道長。 經(jīng)常有香客問我栋盹,道長施逾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任例获,我火速辦了婚禮汉额,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘榨汤。我一直安慰自己蠕搜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布收壕。 她就那樣靜靜地躺著妓灌,像睡著了一般轨蛤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上虫埂,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天祥山,我揣著相機(jī)與錄音,去河邊找鬼掉伏。 笑死缝呕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的斧散。 我是一名探鬼主播岳颇,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼颅湘!你這毒婦竟也來了话侧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤闯参,失蹤者是張志新(化名)和其女友劉穎瞻鹏,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鹿寨,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡新博,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了脚草。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赫悄。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖馏慨,靈堂內(nèi)的尸體忽然破棺而出埂淮,到底是詐尸還是另有隱情,我是刑警寧澤写隶,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布倔撞,位于F島的核電站,受9級(jí)特大地震影響慕趴,放射性物質(zhì)發(fā)生泄漏痪蝇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一冕房、第九天 我趴在偏房一處隱蔽的房頂上張望躏啰。 院中可真熱鬧,春花似錦耙册、人聲如沸给僵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽想际。三九已至培漏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間胡本,已是汗流浹背牌柄。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留侧甫,地道東北人珊佣。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像披粟,于是被迫代替她去往敵國和親咒锻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 以下是Java自帶的性能監(jiān)控工具 必要時(shí)我們需要抓取Java全內(nèi)存的Dump來分析守屉,抓取方式有如下: | jhat...
    jackcooper閱讀 929評(píng)論 2 10
  • 參數(shù)設(shè)置 在Java虛擬機(jī)的參數(shù)中惑艇,有3種表示方法用“ps -ef |grep "java"命令,可以得到當(dāng)前Ja...
    九問閱讀 9,128評(píng)論 2 52
  • 前言 在遇到實(shí)際性能問題時(shí)拇泛,除了關(guān)注系統(tǒng)性能指標(biāo)滨巴。還要結(jié)合應(yīng)用程序的系統(tǒng)的日志、堆棧信息俺叭、GClog恭取、thread...
    Java小鋪閱讀 2,477評(píng)論 0 25
  • 越過生離與死別 方才見畫中人影滅 我難忍幽夜 聲起誘綿纏 若我潑墨淚能干 揮毫譜你一世心安 向上天借去五百年 來償...
    掌覆霞情歌深閱讀 119評(píng)論 0 0
  • 之前我和一個(gè)朋友聊起現(xiàn)處的時(shí)代: 這是一個(gè)最好的時(shí)代,互聯(lián)網(wǎng)技術(shù)飛速發(fā)展以至于我們幾乎可以找到所有我們想要找的資源...
    卓文業(yè)閱讀 325評(píng)論 0 6