深入了解JVM之线上问题排查及工具使用(五)
文章目录
- 一、前言
- 二、常用工具和命令
- 三、问题分类以及处理策略
- 1、业务日志
- 2.死锁
- 3.OOM相关
- 4.线程block、线程数暴涨
- 四、参考
一、前言
线上问题排查是每一个程序员都应该具备的能力,这一篇文章将从问题分类、常用命令和工具、具体案例分析这几个方面进行说明。
二、常用工具和命令
jps,JVM Process Status Tool,用来查看基于HotSpot的JVM里面中,所有具有访问权限的Java进程的具体状态, 包括进程ID,进程启动的路径及启动参数等等,与unix上的ps类似,只不过jps是用来显示java进程,可以把jps理解为ps的一个子集。
jstat,JVM Statistics Monitoring Tool,jstat是用于监视虚拟各种运行状态信息的命令行工具,它可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。
jinfo,Configuration info for java,命令的作用是实时的查看和调整虚拟机的参数。
jmap,Memory Map for java,生成虚拟机的内存转储快照(heapdump)
jhat,JVM Heap Dump Browser,用于分析heapdump文件,它会建立一个Http/HTML服务器,让用户可以在浏览器上查看分析结果
jstack,Stack Trace for java,显示虚拟机的线程快照。
使用–help,查看命令具体使用
常用:
jps -v
jstat -gc 118694 500 5
jmap -dump:live,format=b,file=dump.hprof 29170
jmap -heap 29170
jmap -histo:live 29170 | more
jmap -permstat 29170
jstack -l 29170 |more
jstack 31177 > /home/tengfei.fangtf/dump17
grep java.lang.Thread.State dump17 | awk '{print $2$3$4$5}'
| sort | uniq -c
关于命令的详细说明可以查看jvm系列五:监测命令(jvisualvm jps jstat jmap jhat jstack jinfo)及dump堆内存快照分析
三、问题分类以及处理策略
1、业务日志
如果应用系统出现异常,一般都会在业务日志中体现
统计当天业务日志中ERROR出现数量:egrep ERROR --color logname | wc -l ,如果错误数量过大,一般都是有问题的查看日志中ERROR后10行具体报错:egrep -A 10 ERROR logname | less ,或 -C 10 查看ERROR前后10行日志sed -n '/起始时间/,/结束时间/p' 日志文件sed -n '/2018-12-06 00:00:00/,/2018-12-06 00:03:00/p' logname # 查询三分钟内的日志,后再跟grep 过滤相应关键字sed -n '/2018-12-06 08:38:00/,$p' logname | less # 查询指定时间到当前日志
2.死锁
死锁原因是两个或者多个线程相互等待资源。现象通常是出现线程hung住。更严重会出现线程数暴涨,系统出现api alive报警等。查看死锁最好的方法就是分析当时的线程栈。
用到的命令:
jps -v
jstack -l pid
通过《手写死锁》文中的例子启动了一个发生死锁的进程,执行上述命令,可以定位到引发死锁的代码。
3.OOM相关
发生OOM问题一般服务都会crash,业务日志会有OutOfMemoryError。
OOM一般都是出现了内存泄露,须要查看OOM时候的jvm堆的快照,假设配置了-XX:+HeapDumpOnOutOfMemoryError, 在发生OOM的时候会在-XX:HeapDumpPath生成堆的dump文件。结合MAT,能够对dump文件进行分析。查找出发生OOM的原因。
ps:
1、server的内存一般较大,所以要保证server的磁盘空间大于内存大小
2、另外手动dump堆快照。能够使用命令jmap -dump:format=b,file=file_name pid 或者kill -3 pid常用命令:
$ jhat -J-Xmx512m dump.hprofJVM配置:
-Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:\Users\Administrator\Desktop
分析同样一个dump快照,MAT需要的额外内存比jhat要小的多的多,所以建议使用MAT来进行分析。
4.线程block、线程数暴涨
线程block问题通常是等待io、等待网络、等待监视器锁等造成,可能会导致请求超时、造成造成线程数暴涨导致系统502等。
假设出现这样的问题,主要是关注jstack 出来的BLOCKED、Waiting on condition、Waiting on monitor entry等状态信息。
假设大量线程在“waiting for monitor entry”:可能是一个全局锁堵塞住了大量线程。
假设短时间内打印的 thread dump 文件反映。随着时间流逝。waiting for monitor entry 的线程越来越多,没有降低的趋势,可能意味着某些线程在临界区里呆的时间太长了,以至于越来越多新线程迟迟无法进入临界区。
假设大量线程在“waiting on condition”:可能是它们又跑去获取第三方资源,迟迟获取不到Response,导致大量线程进入等待状态。
假设发现有大量的线程都处在 Wait on condition,从线程堆栈看,正等待网络读写,这可能是一个网络瓶颈的征兆,由于网络堵塞导致线程无法运行。
jstack -l pid |wc -l
jstack -l pid |grep "BLOCKED"|wc -l
jstack -l pid |grep "Waiting on condition"|wc -l
四、参考
java线上服务问题排查总结
jvm系列五:监测命令(jvisualvm jps jstat jmap jhat jstack jinfo)及dump堆内存快照分析
JVM学习之jstat使用方法
深入了解JVM之线上问题排查及工具使用(五)相关推荐
- Java常见线上问题排查及其工具使用
一.常见故障原因 1.网络原因 网络抖动 线路故障 2.外部接口故障 3.中间件原因 负载太高,需要扩容等 4.服务自身原因 OOM JVM参数导致,metaspace太小等 死锁 接口延时高 mys ...
- JVM 线上故障排查
JVM 线上故障排查 Linux 1.1 CPU 1.2 内存 1.3 存储 1.4 网络 一.CPU 飚高 寻找原因 二.内存问题排查 三.一般排查问题的方法 四.应用场景举例 4.1 怎么查看某个 ...
- 【深入理解JVM】JAVA线上故障排查全套路
线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍.同时例如jstack.jmap等工具也是不囿于一个方面的问题的,基 ...
- Java线上问题排查思路及Linux常用问题分析命令学习
前言 之前线上有过一两次OOM的问题,但是每次定位问题都有点手足无措的感觉,刚好利用星期天,以测试环境为模版来学习一下Linux常用的几个排查问题的命令. 也可以帮助自己在以后的工作中快速的排查线上问 ...
- linux 内存溢出排查_记一次JAVA 线上故障排查完整套路
JAVA线上故障排查全套路 线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍.同时例如jstack.jmap等工具也 ...
- php线上问题排查,线上问题排查神器 Arthas
摘要: rController|kite.springcloud.jxm.service.MonitorDashboardServiceoverviewstack输出当前方法被调用的调用路径stack ...
- Java 线上问题排查思路与工具使用
本文来自作者 蓬蒿 在 GitChat 上分享 「Java 线上问题排查思路与工具使用」,「阅读原文」查看交流实录. 「文末高能」 编辑 | 哈比 一.前言 Java 语言是当前互联网应用最为广泛的语 ...
- JAVA线上问题排查及常用命令
前言 线上问题排查是程序员绕不开路.线上故障主要会包括 CPU.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍.同时例如 jstack.jm ...
- java基础巩固-宇宙第一AiYWM:为了维持生计,做项目经验之~SSM项目错误集锦Part3(项目蹦+pg数据库坏+100%-->线上故障排查经验【业务bug第一步一定是先看日志,写好日志】)~整起
项目中遇到的一个问题:项目忽然蹦了,用我们的域名登陆不上去了. 根据之前的经验,一般比如我们项目登不上去了或者数据库不上数据了(数据不更新),直接在Xshell上远程reboot一下,再重启一下tom ...
最新文章
- 浅谈Disruptor
- 师生对话:我们都曾是爱学习的孩子
- 利用Docker/Ansible实现轻量集群服务部署(视频演示+彩蛋)
- 读《财务自由之路》教会我的道理
- CListCtrl 使用演示的例子
- webpack打包流程_了不起的 Webpack 构建流程学习指南
- Windows 与 Linux 通过Xshell 文件互传
- oracle,sqlserver,mysql区别
- Java语法基础----课后实践作业
- 深度学习TF—10.循环神经网络RNN及其变体LSTM、GRU实战
- 复试口语常见话题整理以及华师18 19年topic
- 数字化图书馆软硬件环境要求-转自《博奥智源》
- cad2012打开后闪退_windows7打不开CAD2012出现闪退的解决方法
- 华东交通大学计算机调剂,【通知】华东交通大学2020年硕士研究生调剂通知
- 羽毛球社团php,羽毛球兴趣小组计划
- QQ聊天机器人--基于酷Q写的插件
- QT5+zint库实现条形码条形码(一)
- 自己解决个税申报的步骤
- PhotoshopCS6外挂滤镜安装
- 为自己的snap应用添加变量
热门文章
- [bzoj] 1597 土地购买 || 斜率优化dp
- 华为员工自曝百万级年终奖,论坛征女友!
- Linux如何ping本机IP,Linux ping6 本地ipv6地址无效的参数
- lfs linux 教程,用LFS从零开始构建完整Linux系统
- 游戏中的网络同步机制——Lockstep(转载)
- html5闪光效果,css特效-一道闪光在图片上划过
- 【jzoj2163】【二分】算法学习(sfxx)
- google语音搜索识别API【转载】
- 网络最大流中一般增广路算法(标号法)
- 用java编写一个美元汇率转换,编写一个人民币和美元的双向汇率转换程序,实现美元和人民币转换,汇率:1美元=6.92人民币...