[TOC]html
本篇文章是本人閱讀《深刻理解JVM》和《java虛擬機規範》時的筆記。
記錄的都是一些概念性的東西。
JVM是HotSpot,jdk1.7。
大神繞路,不喜勿噴。java
對於java程序員來講,java
、javac
、javadoc
…… ,這些命令都能熟練地使用。
除了這些命令,在$JAVA_HOME/bin
目錄下還有一些很是經常使用的命令。linux
在本人機器上,該目錄下的內容以下:程序員
$ pwd /c/Program Files/Java/jdk1.8.0_101/bin $ ls appletviewer.exe* javadoc.exe* jcmd.exe* jmap.exe* jstatd.exe* orbd.exe* servertool.exe* extcheck.exe* javafxpackager.exe* jconsole.exe* jmc.exe* jvisualvm.exe* pack200.exe* sigar-amd64-winnt.dll* idlj.exe* javah.exe* jdb.exe* jmc.ini keytool.exe* policytool.exe* sigar-x86-winnt.dll* jabswitch.exe* javap.exe* jdeps.exe* jps.exe* kinit.exe* rmic.exe* tnameserv.exe* jar.exe* javapackager.exe* jhat.exe* jrunscript.exe* klist.exe* rmid.exe* unpack200.exe* jarsigner.exe* java-rmi.exe* jinfo.exe* jsadebugd.exe* ktab.exe* rmiregistry.exe* wsgen.exe* java.exe* javaw.exe* jjs.exe* jstack.exe* msvcr100.dll* schemagen.exe* wsimport.exe* javac.exe* javaws.exe* jli.dll* jstat.exe* native2ascii.exe* serialver.exe* xjc.exe*
喜歡linux的用戶必定用過一個命令就是ps
,爲 Process Snapshot的縮寫,也就是進程快照。
此處的jps也就是 "Java Process Snapshot"(java進程快照)的縮寫了。瀏覽器
語法:服務器
C:\Users\hylexus>jps -help usage: jps [-help] jps [-q] [-mlvV] [<hostid>] Definitions: <hostid>: <hostname>[:<port>]
選項:app
q : 只顯示LVMID(Local Virtual Machine Identifier)而忽略主類名eclipse
m : 進程啓動時傳遞給入口函數(main)的參數函數
l : 輸出全類名或者jar包路徑工具
v : 進程啓動時傳遞的JVM參數
語法
C:\Users\hylexus>jstat -help Usage: jstat -help|-options jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]] Definitions: <option> 要查詢的屬性或VM特性 -class 監視類裝載、卸載數量、總空間以及類裝載耗費的時間 -gc 監視Java的堆。好比Eden、survivor等 -gccapacity 和gc相似,可是主要關注點是堆中各個區域的容量 -gcutil 和gc相似,可是主要關注點是各個區域已使用部分佔總容量的百分比 -gccause 和gcutil相似,可是會同時輸出致使上一次GC的緣由 -gcnew 監視新生代GC情況 -gcnewcapacity ………………(容量) -gcold ………………(老年代) -gcoldcapacity ………………(容量) -compiler JIT編譯器編譯過的方法、耗時等信息 -printcompilation 被JIT編譯器編譯過的方法 <vmid> VMID/LVMID: 在本地環境VMID和LVMID是一致的 遠程環境中VMID應該是: <lvmid>[@<hostname>[:<port>]] <lines> Number of samples between header lines. <interval> 刷新時間間隔: <n>["ms"|"s"],默認單位爲毫秒。 <count> 總共查詢多少次. -J<flag> Pass <flag> directly to the runtime system.
示例:
jstat -gcutil 67008 5s 3 查看pid爲67008的進程的堆內存各個區域佔用總容量百分比, 5秒刷新一次,共查詢3次
運行結果以下:
C:\Users\hylexus>jstat -gcutil 67008 5s 3 S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 0.00 83.42 0.38 48.24 89.79 78.31 31 0.578 5 1.067 1.645 0.00 83.42 0.38 48.24 89.79 78.31 31 0.578 5 1.067 1.645 0.00 83.42 0.38 48.24 89.79 78.31 31 0.578 5 1.067 1.645
說明:
S0: Survivor0(新生代Survivor)是空的
S1: Survivor1(新生代Survivor)是空的
E: Eden(新生代Eden)佔用0.38%
O: Old(老年代)佔用48.24%
M:
CCS:
YGC: Young GC==> Minor GC ==> 新生代GC的次數
YGCT: YGC 耗時0.578秒
FGC: Full GC==>老年代GC的次數
FGCT: FGC總耗時1.067秒
GCT: 全部GC總耗時1.645秒
jinfo能夠查看和調整虛擬機各項參數。
語法
C:\Users\hylexus>jinfo -help Usage: jinfo [option] <pid> (to connect to running process) jinfo [option] <executable <core> (to connect to a core file) jinfo [option] [server_id@]<remote server IP or hostname> (to connect to remote debug server) where <option> is one of: -flag <name> 打印指定參數值 -flag [+|-]<name> 啓用(+)或禁用(-)指定參數 -flag <name>=<value> 設置指定參數的值 -flags 打印JVM參數 -sysprops 至關於System.getProperites() <no option> 表示不帶任何選項,將打印出以上所提到的全部屬性
示例
打印出pid爲67008的進程的JVM參數 C:\Users\hylexus>jinfo -flags 67008 Attaching to process ID 67008, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.101-b13 Non-default VM flags: -XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:CICompilerCount=3 -XX:InitialHeapSize=41943040 -XX:MaxHeapSize=1258291200 -XX:MaxNewSize=419430400 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=13631488 -XX:OldSize=28311552 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC Command line: -Dosgi.requiredJavaVersion=1.8 -Xms40m -Xverify:none -Dorg.eclipse.swt.browser.IEVersion=10001 -Xmx1200m
查詢pid爲67008的進程的初始堆大小 C:\Users\hylexus>jinfo -flag InitialHeapSize 67008 -XX:InitialHeapSize=41943040
jmap(Memory map)能夠生成堆轉儲快照(通常稱爲heapdump或dump文件)
語法
C:\Users\hylexus>jmap -help Usage: jmap [option] <pid> (to connect to running process) jmap [option] <executable <core> (to connect to a core file) jmap [option] [server_id@]<remote server IP or hostname> (to connect to remote debug server) where <option> is one of: <none> 不帶選項,打印出和Solaris下的pmap同樣的信息 -heap 打印出堆的詳細狀況 如垃圾收集器組合、分帶狀況等 只在Linux下有效 -histo[:live] 堆中對象信息統計。如類實例數量等。 live,只統計活着的對象信息 -clstats 類加載器信息 -finalizerinfo 打印出在F-Queue隊列中等待執行finalizer()方法的對象信息 -dump:<dump-options> 堆轉儲快照 dump-options: live 只是dump出存活着的對象 format=b binary format file=<file> 可選,dump到哪一個文件中 示例: jmap -dump:live,format=b,file=heap.bin <pid> -F 當JVM對-dump選項沒有響應時能夠是使用-F來強制dump 只在Linux/Solaris下有效
示例
jmap -heap 67008 jmap -finalizerinfo 67008 jmap -dump:live,format=b,file=t.bin 67008
jhat(JVM Heap Analysis Tool)是虛擬機堆轉儲快照分析工具。通常是用來分析用jmap生成的堆快照信息。
可是他的分析結果不太美觀,不是很是容易讀懂。
他會啓動一個內置的http服務器來將分析結果展示爲html格式。
示例
生成快照 C:\Users\hylexus>jmap -dump:live,format=b,file=t.bin 67008 Dumping heap to C:\Users\hylexus\t.bin ... Heap dump file created C:\Users\hylexus> # 分析快照 C:\Users\hylexus>jhat t.bin Reading from t.bin... Dump file created Mon Dec 19 22:43:48 CST 2016 Snapshot read, resolving... Resolving 1861041 objects... Chasing references, expect 372 dots.................................................................................................................................................................................................................................................................................................................................................................................... Eliminating duplicate references.................................................................................................................................................................................................................................................................................................................................................................................... Snapshot resolved. Started HTTP server on port 7000 Server is ready.
此時在瀏覽器裏訪問 127.0.0.1:7000就能看到分析結果:
jstack(Stack Trace for Java)能夠生成虛擬機當前時刻的線程快照。
通常稱爲threaddump
或者javacore
文件。即每一條線程正在執行的方法堆棧的集合。
語法
C:\Users\hylexus>jstack -help Usage: jstack [-l] <pid> (to connect to running process) jstack -F [-m] [-l] <pid> (to connect to a hung process) jstack [-m] [-l] <executable> <core> (to connect to a core file) jstack [-m] [-l] [server_id@]<remote server IP or hostname> (to connect to a remote debug server) Options: -F 當JVM不響應該請求時強制進行線程dump -m 顯示java方法也能夠是本地方法的堆棧信息 -l 顯示有關鎖的附加信息
對於這兩個可視化工具的使用就不在多說什麼了。
點鼠標誰都會。
《深刻理解JVM》
《Java虛擬機規範》-JDK1.7