java命令--jhat命令使用

jhat也是jdk內置的工具之一。主要是用來分析java堆的命令,能夠將堆中的對象以html的形式顯示出來,包括對象的數量,大小等等,並支持對象查詢語言javascript

 

使用jmap等方法生成java的堆文件後,使用其進行分析。html

第一步:導出堆java

#jmap -dump:live,file=a.log pidweb

除了使用jmap命令,還能夠經過如下方式:正則表達式

一、使用 jconsole 選項經過 HotSpotDiagnosticMXBean 從運行時得到堆轉儲(生成dump文件)、express

二、虛擬機啓動時若是指定了 -XX:+HeapDumpOnOutOfMemoryError 選項, 則在拋出 OutOfMemoryError 時, 會自動執行堆轉儲。數組

三、使用 hprof 命令jvm

 

第二步:分析堆文件ide

#jhat -J-Xmx512M a1.log函數

說明:有時dump出來的堆很大,在啓動時會報堆空間不足的錯誤,可加參數:jhat -J-Xmx512m <heap dump file>。這個內存大小可根據本身電腦進行設置。

解析Java堆轉儲文件,並啓動一個 web server

 

第三步:查看html

http://ip:7000/

對於jhat啓動後顯示的html頁面中功能:
(1)顯示出堆中所包含的全部的類

 

 

(2)從根集能引用到的對象

(3)顯示平臺包括的全部類的實例數量

 

 

(4)堆實例的分佈表

 

(5)執行對象查詢語句

 

輸入內容如:

#查詢長度大於100的字符串
select s from java.lang.String s where s.count > 100

詳細的OQL可點擊上圖的「OQL help」

 

複製代碼

複製代碼

jhat中的OQL(對象查詢語言) 
若是須要根據某些條件來過濾或查詢堆的對象,這是可能的,能夠在jhat的html頁面中執行OQL,來查詢符合條件的對象

基本語法: 
select <javascript expression to select>
[from [instanceof] <class name> <identifier>]
[where <javascript boolean expression to filter>]

解釋: 
(1)class name是java類的徹底限定名,如:java.lang.String, java.util.ArrayList, [C是char數組, [Ljava.io.File是java.io.File[]
(2)類的徹底限定名不足以惟一的辨識一個類,由於不一樣的ClassLoader載入的相同的類,它們在jvm中是不一樣類型的
(3)instanceof表示也查詢某一個類的子類,若是不明確instanceof,則只精確查詢class name指定的類
(4)from和where子句都是可選的
(5)java域表示:obj.field_name;java數組表示:array[index]

舉例: 
(1)查詢長度大於100的字符串
select s from java.lang.String s where s.count > 100

(2)查詢長度大於256的數組
select a from [I a where a.length > 256
(3)顯示匹配某一正則表達式的字符串
select a.value.toString() from java.lang.String s where /java/(s.value.toString())
(4)顯示全部文件對象的文件路徑
select file.path.value.toString() from java.io.File file
(5)顯示全部ClassLoader的類名
select classof(cl).name from instanceof java.lang.ClassLoader cl
(6)經過引用查詢對象
select o from instanceof 0xd404d404 o

built-in對象 -- heap 
(1)heap.findClass(class name) -- 找到類
select heap.findClass("java.lang.String").superclass
(2)heap.findObject(object id) -- 找到對象
select heap.findObject("0xd404d404")
(3)heap.classes -- 全部類的枚舉
select heap.classes
(4)heap.objects -- 全部對象的枚舉
select heap.objects("java.lang.String")
(5)heap.finalizables -- 等待垃圾收集的java對象的枚舉
(6)heap.livepaths -- 某一對象存活路徑
select heaplivepaths(s) from java.lang.String s
(7)heap.roots -- 堆根集的枚舉

辨識對象的函數 
(1)classof(class name) -- 返回java對象的類對象
select classof(cl).name from instanceof java.lang.ClassLoader cl
(2)identical(object1,object2) -- 返回是否兩個對象是同一個實例
select identical(heap.findClass("java.lang.String").name, heap.findClass("java.lang.String").name)
(3)objectid(object) -- 返回對象的id
select objectid(s) from java.lang.String s
(4)reachables -- 返回可從對象可到達的對象
select reachables(p) from java.util.Properties p -- 查詢從Properties對象可到達的對象
select reachables(u, "java.net.URL.handler") from java.net.URL u -- 查詢從URL對象可到達的對象,但不包括從URL.handler可到達的對象
(5)referrers(object) -- 返回引用某一對象的對象
select referrers(s) from java.lang.String s where s.count > 100
(6)referees(object) -- 返回某一對象引用的對象
select referees(s) from java.lang.String s where s.count > 100
(7)refers(object1,object2) -- 返回是否第一個對象引用第二個對象
select refers(heap.findObject("0xd4d4d4d4"),heap.findObject("0xe4e4e4e4"))
(8)root(object) -- 返回是否對象是根集的成員
select root(heap.findObject("0xd4d4d4d4")) 
(9)sizeof(object) -- 返回對象的大小
select sizeof(o) from [I o
(10)toHtml(object) -- 返回對象的html格式
select "<b>" + toHtml(o) + "</b>" from java.lang.Object o
(11)選擇多值
select {name:t.name?t.name.toString():"null",thread:t} from instanceof java.lang.Thread t

數組、迭代器等函數 
(1)concat(enumeration1,enumeration2) -- 將數組或枚舉進行鏈接
select concat(referrers(p),referrers(p)) from java.util.Properties p
(2)contains(array, expression) -- 數組中元素是否知足某表達式
select p from java.util.Properties where contains(referres(p), "classof(it).name == 'java.lang.Class'")
返回由java.lang.Class引用的java.util.Properties對象
built-in變量
it -- 當前的迭代元素
index -- 當前迭代元素的索引
array -- 被迭代的數組
(3)count(array, expression) -- 知足某一條件的元素的數量
select count(heap.classes(), "/java.io./(it.name)")
(4)filter(array, expression) -- 過濾出知足某一條件的元素
select filter(heap.classes(), "/java.io./(it.name)")
(5)length(array) -- 返回數組長度
select length(heap.classes())
(6)map(array,expression) -- 根據表達式對數組中的元素進行轉換映射
select map(heap.classes(),"index + '-->' + toHtml(it)")
(7)max(array,expression) -- 最大值, min(array,expression)
select max(heap.objects("java.lang.String"),"lhs.count>rhs.count")
built-in變量
lhs -- 左邊元素
rhs -- 右邊元素
(8)sort(array,expression) -- 排序
select sort(heap.objects('[C'),'sizeof(lhs)-sizeof(rhs)')
(9)sum(array,expression) -- 求和
select sum(heap.objects('[C'),'sizeof(it)')
(10)toArray(array) -- 返回數組
(11)unique(array) -- 惟一化數組

複製代碼

複製代碼

 

 

參考資料:

http://blog.csdn.net/gtuu0123/article/details/6039474

http://www.cnblogs.com/o-andy-o/archive/2013/06/11/3132316.html

Java命令學習系列(五)——jhat

相關文章
相關標籤/搜索