java-core P487 P515
chapter11,主要讲java的异常,里面很多内容收获良多,之前一直没注意过的。
一,Throwable类获得StackTraceElement ,可进行堆栈跟踪,用法如下:
Throwable t = new Throwable(); StackTraceElement [] frames = t.getStackTrace(); for(StackTraceElement frame :frames) analyze frame Map<Thread,StackTraceElement[] map>=Thread.getAllStackTraces(); for(Thread t :map.keySet()){ StackTraceElement[] frames k= map.get(t); analyze frames }
示例:
public class TestHeap {
public static void main(String[]args){
Throwable t = new Throwable();
StringWriter out = new StringWriter();
t.printStackTrace(new PrintWriter(out));
String description = out.toString();
System.out.println(description);
System.out.println("——————分割线——————");
StackTraceElement[]frames = t.getStackTrace();
for(StackTraceElement frame:frames){
System.out.println(frame);
}
System.out.println("——————分割线——————");
Map<Thread,StackTraceElement[]> map = Thread.getAllStackTraces();
for(Thread t1:map.keySet()){
StackTraceElement []fram=map.get(t1);
for(StackTraceElement element :fram){
System.out.println("--- "+element.getClassName()+"--- "
+element.getClass().getName()+" ---"+element.getFileName()
+",--- "+element.getMethodName()+",--- "+element.getLineNumber());
}
}
}
}
输出结果:
java.lang.Throwable at enums.TestHeap.main(TestHeap.java:9) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) ——————分割线—————— enums.TestHeap.main(TestHeap.java:9) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:498) com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) ——————分割线—————— --- java.lang.ClassLoader$NativeLibrary--- java.lang.StackTraceElement ---ClassLoader.java,--- load,--- -2 --- java.lang.ClassLoader--- java.lang.StackTraceElement ---ClassLoader.java,--- loadLibrary0,--- 1941 --- java.lang.ClassLoader--- java.lang.StackTraceElement ---ClassLoader.java,--- loadLibrary,--- 1845 --- java.lang.Runtime--- java.lang.StackTraceElement ---Runtime.java,--- loadLibrary0,--- 870 --- java.lang.System--- java.lang.StackTraceElement ---System.java,--- loadLibrary,--- 1122 --- java.net.AbstractPlainSocketImpl$1--- java.lang.StackTraceElement ---AbstractPlainSocketImpl.java,--- run,--- 84 --- java.net.AbstractPlainSocketImpl$1--- java.lang.StackTraceElement ---AbstractPlainSocketImpl.java,--- run,--- 82 --- java.security.AccessController--- java.lang.StackTraceElement ---AccessController.java,--- doPrivileged,--- -2 --- java.net.AbstractPlainSocketImpl--- java.lang.StackTraceElement ---AbstractPlainSocketImpl.java,--- <clinit>,--- 81 --- java.net.ServerSocket--- java.lang.StackTraceElement ---ServerSocket.java,--- setImpl,--- 288 --- java.net.ServerSocket--- java.lang.StackTraceElement ---ServerSocket.java,--- <init>,--- 230 --- java.net.ServerSocket--- java.lang.StackTraceElement ---ServerSocket.java,--- <init>,--- 128 --- com.intellij.rt.execution.application.AppMain$1--- java.lang.StackTraceElement ---AppMain.java,--- run,--- 77 --- java.lang.Thread--- java.lang.StackTraceElement ---Thread.java,--- run,--- 748 --- java.lang.Thread--- java.lang.StackTraceElement ---Thread.java,--- dumpThreads,--- -2 --- java.lang.Thread--- java.lang.StackTraceElement ---Thread.java,--- getAllStackTraces,--- 1610 --- enums.TestHeap--- java.lang.StackTraceElement ---TestHeap.java,--- main,--- 20 --- sun.reflect.NativeMethodAccessorImpl--- java.lang.StackTraceElement ---NativeMethodAccessorImpl.java,--- invoke0,--- -2 --- sun.reflect.NativeMethodAccessorImpl--- java.lang.StackTraceElement ---NativeMethodAccessorImpl.java,--- invoke,--- 62 --- sun.reflect.DelegatingMethodAccessorImpl--- java.lang.StackTraceElement ---DelegatingMethodAccessorImpl.java,--- invoke,--- 43 --- java.lang.reflect.Method--- java.lang.StackTraceElement ---Method.java,--- invoke,--- 498 --- com.intellij.rt.execution.application.AppMain--- java.lang.StackTraceElement ---AppMain.java,--- main,--- 147 --- java.lang.Object--- java.lang.StackTraceElement ---Object.java,--- wait,--- -2 --- java.lang.ref.ReferenceQueue--- java.lang.StackTraceElement ---ReferenceQueue.java,--- remove,--- 143 --- java.lang.ref.ReferenceQueue--- java.lang.StackTraceElement ---ReferenceQueue.java,--- remove,--- 164 --- java.lang.ref.Finalizer$FinalizerThread--- java.lang.StackTraceElement ---Finalizer.java,--- run,--- 209 --- java.lang.Object--- java.lang.StackTraceElement ---Object.java,--- wait,--- -2 --- java.lang.Object--- java.lang.StackTraceElement ---Object.java,--- wait,--- 502 --- java.lang.ref.Reference--- java.lang.StackTraceElement ---Reference.java,--- tryHandlePending,--- 191 --- java.lang.ref.Reference$ReferenceHandler--- java.lang.StackTraceElement ---Reference.java,--- run,--- 153 Process finished with exit code 0
二,jconsole和jmap
之前有了解过java的JVM性能监控工具,但是没有具体执行过,只是有个很模糊的概念。
jconsole原理:
java允许虚拟机中的代理装置跟踪内存消耗,线程使用,类加载等情况。jconsole就是一个展示这种功能的例子:用于显示虚拟机性能的统计结果。
jconsole 用法
>cmd >jconsole
>jconsole pid
jconsole页面
jmap
可以使用jmap获得一个堆的存储,其中显示了堆中的每个对象,使用如下:
jmap pid
结果如下
C:\Users\user>jmap 3128 Attaching to process ID 3128, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.144-b01 0x0000000053040000 36K C:\Program Files\Java\jdk1.8.0_144\jre\bin\attach.dll 0x0000000053050000 840K C:\Program Files\Java\jdk1.8.0_144\bin\MSVCR100.dll 0x0000000053130000 188K C:\Program Files\Java\jdk1.8.0_144\bin\jli.dll 0x0000000053160000 840K C:\Program Files\Java\jdk1.8.0_144\jre\bin\msvcr100.dll 0x0000000053240000 168K C:\Program Files\Java\jdk1.8.0_144\jre\bin\dcpr.dll 0x00000000532c0000 264K C:\Program Files\Java\jdk1.8.0_144\jre\bin\t2k.dll 0x0000000053390000 52K C:\Program Files\Java\jdk1.8.0_144\jre\bin\management.dll 0x00000000533a0000 68K C:\Program Files\Java\jdk1.8.0_144\jre\bin\nio.dll 0x00000000533c0000 104K C:\Program Files\Java\jdk1.8.0_144\jre\bin\net.dll 0x00000000533e0000 284K C:\Program Files\Java\jdk1.8.0_144\jre\bin\fontmanager.dll 0x0000000053430000 1632K C:\Program Files\Java\jdk1.8.0_144\jre\bin\awt.dll 0x00000000535d0000 88K C:\Program Files\Java\jdk1.8.0_144\jre\bin\zip.dll 0x0000000053620000 164K C:\Program Files\Java\jdk1.8.0_144\jre\bin\java.dll 0x0000000053650000 60K C:\Program Files\Java\jdk1.8.0_144\jre\bin\verify.dll 0x0000000053740000 8820K C:\Program Files\Java\jdk1.8.0_144\jre\bin\server\jvm.dll 0x0000000180000000 804K c:\program files (x86)\kingsoft\kingsoft antivirus\kwsui64.dll 0x00007ff6c24d0000 28K C:\Program Files\Java\jdk1.8.0_144\bin\jconsole.exe
另外,还有一个收费的工具,比较有名也直接,叫jprofiler。
可参考:
https://www.cnblogs.com/AmilyWilly/p/7272160.html?utm_source=itdadao&utm_medium=referral