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

java堆栈信息查看,以及JVM性能查看工具-jconsole+jmap的更多相关文章

  1. jstack查看Java堆栈信息

    命令 jps 查看进程id jstack 1234 查看该进程的线程堆栈信息 对于每个线程,都有如下信息: 线程名,如“main”线程属性(如果是Daemon线程,会有Daemon标识,否则,什么都没 ...

  2. Java架构师面试题——JVM性能调优

    JVM内存调优 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数. 1.Full GC 会对整个堆进行整理,包括Young.Tenured和Perm.Full GC因为需要对 ...

  3. 打印java堆栈信息

    使用如下命令: kill -3 {pid} 可以打印指定线程的堆栈信息到tomcat的catalina.out日志中.在性能测试过程中,可以观察响应时间的曲线,如果突然出现波峰则抓取当前时间点tomc ...

  4. jstack与jmap分析java堆栈信息

    首先确定要查询的服务进程pid,可用ps -ef|grep 进程名称 jstack -l pid >> stack_info.txt,将此进程的堆栈信息导出到txt文件中 其中" ...

  5. JVM性能分析工具详解--MAT等

    获得堆转储文件 巧妇难为无米之炊,我们首先需要获得一个堆转储文件.为了方便,本文采用的是 Sun JDK 6.通常来说,只要你设置了如下所示的 JVM 参数: -XX:+HeapDumpOnOutOf ...

  6. java性能分析工具 jconsole.exe

    通过 Java visualMv结合 jconsole.exe   工具即可查看如图所示(Jconsole在JDK文件夹内,非JRE文件夹) 在Java Visualvm工具里面安装JTA插件,分析线 ...

  7. 学习笔记——JVM性能调优之 jmap

    jmap jmap(JVM Memory Map)命令可生成head dump文件,还可查询finalize执行队列.Java堆和永久代的详细信息. 通过配置启动参数:-XX:+HeapDumpOnO ...

  8. JVM性能监测工具——VisualVM

    Java本身自带了有好几个jvm监测工具,其中jconsole和jvisualvm这两个工具具有图形化界面,可以监测到cpu.类.线程.堆等一些参数,而且具有远程监控的能力. 启动:打开cmd命令窗口 ...

  9. java命令--jstack 工具 查看JVM堆栈信息

    介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项" ...

随机推荐

  1. 在同一个页面多次调用el-select选择器

    elementui是一个十分好用的组件库,但毕竟也不能做到面面俱到,有些还是要根据根据自己的实际需求做一些自定义的方法. 比如el-select选择器在同一个页面使用多次的话就会造成选择一个另一个也会 ...

  2. mysql的AB及读写和集群

    Mysql的AB及读写  第1章 Mysql的AB配置 1.1 master配置 1.2 slave配置 第2章 读写分离 2.1 安装mycat 2.2 启动mycat 2.3 登录mycat相关问 ...

  3. WCF-复杂配置

    两种模式,一个契约两个实现,两个契约一个实现. 服务类库 宿主 static void Main(string[] args) { ServiceHost sh1 = new ServiceHost( ...

  4. IDEA使用 maven 搭建 SSM 框架

    文章目录 pom 文件的编写 项目结构 SSM 配置文件的编写 web.xml 的配置 总结 公司有个小的内部使用的软件,让开发,自己选择使用 SSM :因为之前自己学过,本以为一切水到渠成,但是好久 ...

  5. pandas数据结构之Panel笔记

    Panel创建的是三维的表 items:坐标轴0,索引对应的元素是一个DataFrame major_axis:坐标轴1,DataFrame里的行标签 minor_axis:坐标轴2,DataFram ...

  6. PHP trait介绍

    Trait 自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait. Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制.Trait 为了减少单继承语言的限制, ...

  7. Spring Boot 多个域名指向同一IP

    一.需求:直接通过域名访问首页(同一应用下,多个首页,包括PC端.手机端首页) 方法:采用多个域名绑定同一IP下同一应用,不同域名对应不同产品(PC.手机端)的方法,在后台通过拦截器判断 reques ...

  8. C#一些面试知识题

    1.简述 private. protected. public.internal 修饰符的访问权限答:private:私有成员, 在类的内部才可以访问(只能从其声明上下文中进行访问). protect ...

  9. 请问IOS中做一个手机网站的app壳复杂吗?

    公司开发了一个平台,手机网站已经做出来了,想开发一个苹果应用app,但公司没人会IOS开发,为了减小成本,现在想直接做一个壳来加载手机网站,请问在ios中复杂吗?是否有相应的控件直接加载url就行? ...

  10. Rsync同步过程中遇到的常见问题

    一.Rsync服务介绍 Rsync属于一款实现全量及增量同步数据的软件工具,适用于unix/linux/windows等多种操作系统平台. Rsync软件能实现本地复制,远程复制,或者远程守护进程方式 ...