如果大家有遇到過Java內存洩露問題
但由於傳統的分析過程比較麻煩
整體實現思路如下
下面帖出的主要代碼來說明各步驟具體實現方法
l JDK
private static Class<?> findVirtualMachineClass() throws ClassNotFoundException
MalformedURLException {
// JVM 虛擬機操作類
final String virtualMachineClassName =
try {
return Class
} catch (final ClassNotFoundException e) {
// exception ignored
File file = new File(System
if (
file = file
}
//直接從JDK的 lib目錄下加載 tools
final String[] defaultToolsLocation = {
for (final String name : defaultToolsLocation) {
file = new File(file
}
final URL[] urls = { file
final ClassLoader cl = URLClassLoader
//再次嘗試反射查詢 JVM虛擬機操作類
return Class
}
}
l 利用反射調用VirtualMachine的attach方法
本過程相對比較簡單
//獲取JVM 虛擬機操作類後
final Class<?> virtualMachineClass = findVirtualMachineClass()
//根據反射查詢 attach方法
final Method attachMethod = virtualMachineClass
//通過 getpids
final String pid = PID
try {
//通過反射調用attache方法
jvmVirtualMachine = invoke(attachMethod
} finally {
enabled = jvmVirtualMachine != null;
}
l 復用反射調用VirtualMachine實例的heapHisto方法
本過程也是利用反射調用heapHisto方法
final Class<?> virtualMachineClass = getJvmVirtualMachine()
//反射調用 heapHisto方法
final Method heapHistoMethod = virtualMachineClass
Object[]
//該方面返回值為InputStream
return (InputStream) invoke(heapHistoMethod
new Object[] { new Object[] {
l 最後解析heapHisto方法返回的輸入流
Input Stream取出的結果(文本內容)示例如下
num #instances #bytes class name
Total
null
因為內容太長
因為讀取的是文本內容
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26337.html