JAVA运行时问题诊断-工具应用篇
2016-03-25 17:24
615 查看
该BLOG内容是之前在部门组织讨论运行时问题时自己写的PPT内容,内容以点带面,主要是方便以后自己回顾查看。
大纲包括:1、运行时问题分类 2、服务器自带工具 3、其他工具 4、例子 5、实际情况
运行时问题分类-软件角度:1、内存泄漏,对象未释放 2、线程阻塞、死锁 3、线程死循环 4、网络IO连接超时时间过长 5、磁盘不可写 .....
运行时问题分类-硬件角度:1、内存占用高 2、CPU占用高 3、网络无反应 4、硬盘空间满 ....
Linux指令:1、top, top -Hp pid 2、free 3、df 4、netstat, netstat -natp ...
JDK指令:1、jps, jps -v 2、jstack, jstack pid 3、jmap, jmap -dump:format=b,file=/opt/... 4、jstat, jstat -gcutil(gc,gccapacity) pid ....
工具:
实时分析工具: 1、Jconsole 2、VisualVM 3、JProfiler 4、JavaMelody 5、LambdaProbe ....
离线分析工具: 1、MemoryAnalyzer tool 2、Thread Dump Analyzer ....
DEMO:1、内存溢出 2、CPU占用过高 3、线程死锁 4、线程阻塞
准备工作:堆栈内存设置低一点,打印GC日志和OOM时输出dump文件: set JAVA_OPTS=-server -Xms24m -Xmx50m -XX:PermSize=28M -XX:MaxPermSize=80m -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:\temp\dump
内存溢出:
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910095946122-97671876.png)
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910100011637-978513750.png)
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910100030340-1308670714.png)
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910100049762-729582104.png)
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910100107356-1655831100.png)
MAT-关键字(个人理解,不一定准确):
Histogram:内存中的类对象实例的对象的个数和大小
Dominator Tree:堆对象树,对象大小和占用百分比
Leak Suspects:MAT分析的内存泄漏的可疑点
shallow heap:对象自身占用内存大小
retained heap:对象自身和引用的对象占用内存大小
Merge Shortest Paths to GC Roots:从GC根节点到该对象的路径视图
with outgoing references:对象持有的外部对象引用
with incomming references:对象被哪些外部对象引用
....
CPU占用过高:
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910100306153-1251381913.png)
线程死锁:
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910100458309-531316411.png)
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910100514090-2068431830.png)
线程阻塞:
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910100718762-1350924569.png)
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910100730887-2117237579.png)
线程状态(个人理解,不一定准确):
WAITING (parking):线程自身挂起等待,正常
WAITING (on object monitor):线程主动执行wait,等待资源,如果是自己的程序,需要关注
BLOCKED (on object monitor):线程阻塞,等待对方释放资源,如果是互相等待对方阻塞的线程,则发生死锁
TIMED_WAITING (on object monitor):线程调用了wait(long timeout),在特定时间内等待
TIMED_WAITING (sleeping):调用了sleeping,休眠一段时间
JavaMelody:
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910100849575-1112045960.png)
LambdaProbe
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910100905856-2107250953.png)
实际情况:
用户反馈各种千奇百怪的问题!
网络访问连接不上
网站、接口访问超时
特定功能很慢
部分功能部分人打不开
.......
->
ping,telnet,traceroute....
top,top -Hp pid,jstack pid....
jstat -gc,gcutil,gccapacity pid...
jmap -dump:format=b,file=/opt/.... tail, df -lh....
netstat -natp....
.....
生产问题没有统一解决办法,具体问题具体分析
内存查看:jstat
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910101150512-926092749.png)
线程情况查看:top -Hp pid
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910101215028-329765670.png)
CPU查看:jstack
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910101141294-1146449497.png)
网络查看:netstat
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910101257684-716753494.png)
实际问题分析:
线上查看 服务器情况分析 获取内存dump 获取javacore
线下分析 工具调试分析内存线程
代码调试 Eclipse Class Decompiler(自动反编译,选择JD-Core,精确行数)
...
转载请注明:http://lawson.cnblogs.com
上面是实际生产问题的自己写的PPT,copy下来的,JDK自带的工具和指令比较强大,本篇文章没有太多介绍。
大纲包括:1、运行时问题分类 2、服务器自带工具 3、其他工具 4、例子 5、实际情况
运行时问题分类-软件角度:1、内存泄漏,对象未释放 2、线程阻塞、死锁 3、线程死循环 4、网络IO连接超时时间过长 5、磁盘不可写 .....
运行时问题分类-硬件角度:1、内存占用高 2、CPU占用高 3、网络无反应 4、硬盘空间满 ....
Linux指令:1、top, top -Hp pid 2、free 3、df 4、netstat, netstat -natp ...
JDK指令:1、jps, jps -v 2、jstack, jstack pid 3、jmap, jmap -dump:format=b,file=/opt/... 4、jstat, jstat -gcutil(gc,gccapacity) pid ....
工具:
实时分析工具: 1、Jconsole 2、VisualVM 3、JProfiler 4、JavaMelody 5、LambdaProbe ....
离线分析工具: 1、MemoryAnalyzer tool 2、Thread Dump Analyzer ....
DEMO:1、内存溢出 2、CPU占用过高 3、线程死锁 4、线程阻塞
准备工作:堆栈内存设置低一点,打印GC日志和OOM时输出dump文件: set JAVA_OPTS=-server -Xms24m -Xmx50m -XX:PermSize=28M -XX:MaxPermSize=80m -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:\temp\dump
内存溢出:
Map<String, Person> map = new HashMap<String, Person>(); Object[] array = new Object[1000000]; for (int i = 0; i < 1000000; i++) { String d = new Date().toString(); Person p = new Person(d, i); map.put(i + "person", p); array[i] = p; }
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910095946122-97671876.png)
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910100011637-978513750.png)
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910100030340-1308670714.png)
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910100049762-729582104.png)
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910100107356-1655831100.png)
MAT-关键字(个人理解,不一定准确):
Histogram:内存中的类对象实例的对象的个数和大小
Dominator Tree:堆对象树,对象大小和占用百分比
Leak Suspects:MAT分析的内存泄漏的可疑点
shallow heap:对象自身占用内存大小
retained heap:对象自身和引用的对象占用内存大小
Merge Shortest Paths to GC Roots:从GC根节点到该对象的路径视图
with outgoing references:对象持有的外部对象引用
with incomming references:对象被哪些外部对象引用
....
CPU占用过高:
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910100306153-1251381913.png)
线程死锁:
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910100458309-531316411.png)
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910100514090-2068431830.png)
线程阻塞:
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910100718762-1350924569.png)
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910100730887-2117237579.png)
线程状态(个人理解,不一定准确):
WAITING (parking):线程自身挂起等待,正常
WAITING (on object monitor):线程主动执行wait,等待资源,如果是自己的程序,需要关注
BLOCKED (on object monitor):线程阻塞,等待对方释放资源,如果是互相等待对方阻塞的线程,则发生死锁
TIMED_WAITING (on object monitor):线程调用了wait(long timeout),在特定时间内等待
TIMED_WAITING (sleeping):调用了sleeping,休眠一段时间
JavaMelody:
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910100849575-1112045960.png)
LambdaProbe
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910100905856-2107250953.png)
实际情况:
用户反馈各种千奇百怪的问题!
网络访问连接不上
网站、接口访问超时
特定功能很慢
部分功能部分人打不开
.......
->
ping,telnet,traceroute....
top,top -Hp pid,jstack pid....
jstat -gc,gcutil,gccapacity pid...
jmap -dump:format=b,file=/opt/.... tail, df -lh....
netstat -natp....
.....
生产问题没有统一解决办法,具体问题具体分析
内存查看:jstat
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910101150512-926092749.png)
线程情况查看:top -Hp pid
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910101215028-329765670.png)
CPU查看:jstack
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910101141294-1146449497.png)
网络查看:netstat
![](http://images2015.cnblogs.com/blog/42222/201509/42222-20150910101257684-716753494.png)
实际问题分析:
线上查看 服务器情况分析 获取内存dump 获取javacore
线下分析 工具调试分析内存线程
代码调试 Eclipse Class Decompiler(自动反编译,选择JD-Core,精确行数)
...
转载请注明:http://lawson.cnblogs.com
上面是实际生产问题的自己写的PPT,copy下来的,JDK自带的工具和指令比较强大,本篇文章没有太多介绍。
相关文章推荐
- java获取获得Timestamp类型的当前系统时间
- bzoj 3198 spring
- Java并发编程:synchronized
- JavaWeb项目开发案例精粹-第3章在线考试系统-001设计
- java中字符跟字节转换 总结
- Java8多重注解示例
- 各种排序算法的分析及java实现
- Spring实现AOP的4种方式
- java模式之单例模式
- eclipse不清空class下文件
- JAVA的集合类型有哪些
- JAVA基础--super关键字
- java url方法解释
- Java RTTI与反射(参照Java编程思想与新浪博客)
- JAVA基础--方法的重写overwrite 和 重载overload
- Java——文件选择框:JFileChooser
- Java中enum的用法总结
- Java存储到什么地方
- 20、在Java应用中使用Json
- Dubbo 通过Spring 配置具体启动服务