文章目录

  • 一、前言
  • 二、常用工具和命令
  • 三、问题分类以及处理策略
    • 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之线上问题排查及工具使用(五)相关推荐

  1. Java常见线上问题排查及其工具使用

    一.常见故障原因 1.网络原因 网络抖动 线路故障 2.外部接口故障 3.中间件原因 负载太高,需要扩容等 4.服务自身原因 OOM JVM参数导致,metaspace太小等 死锁 接口延时高 mys ...

  2. JVM 线上故障排查

    JVM 线上故障排查 Linux 1.1 CPU 1.2 内存 1.3 存储 1.4 网络 一.CPU 飚高 寻找原因 二.内存问题排查 三.一般排查问题的方法 四.应用场景举例 4.1 怎么查看某个 ...

  3. 【深入理解JVM】JAVA线上故障排查全套路

    线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍.同时例如jstack.jmap等工具也是不囿于一个方面的问题的,基 ...

  4. Java线上问题排查思路及Linux常用问题分析命令学习

    前言 之前线上有过一两次OOM的问题,但是每次定位问题都有点手足无措的感觉,刚好利用星期天,以测试环境为模版来学习一下Linux常用的几个排查问题的命令. 也可以帮助自己在以后的工作中快速的排查线上问 ...

  5. linux 内存溢出排查_记一次JAVA 线上故障排查完整套路

    JAVA线上故障排查全套路 线上故障主要会包括cpu.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍.同时例如jstack.jmap等工具也 ...

  6. php线上问题排查,线上问题排查神器 Arthas

    摘要: rController|kite.springcloud.jxm.service.MonitorDashboardServiceoverviewstack输出当前方法被调用的调用路径stack ...

  7. Java 线上问题排查思路与工具使用

    本文来自作者 蓬蒿 在 GitChat 上分享 「Java 线上问题排查思路与工具使用」,「阅读原文」查看交流实录. 「文末高能」 编辑 | 哈比 一.前言 Java 语言是当前互联网应用最为广泛的语 ...

  8. JAVA线上问题排查及常用命令

    前言 线上问题排查是程序员绕不开路.线上故障主要会包括 CPU.磁盘.内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍.同时例如 jstack.jm ...

  9. java基础巩固-宇宙第一AiYWM:为了维持生计,做项目经验之~SSM项目错误集锦Part3(项目蹦+pg数据库坏+100%-->线上故障排查经验【业务bug第一步一定是先看日志,写好日志】)~整起

    项目中遇到的一个问题:项目忽然蹦了,用我们的域名登陆不上去了. 根据之前的经验,一般比如我们项目登不上去了或者数据库不上数据了(数据不更新),直接在Xshell上远程reboot一下,再重启一下tom ...

最新文章

  1. 浅谈Disruptor
  2. 师生对话:我们都曾是爱学习的孩子
  3. 利用Docker/Ansible实现轻量集群服务部署(视频演示+彩蛋)
  4. 读《财务自由之路》教会我的道理
  5. CListCtrl 使用演示的例子
  6. webpack打包流程_了不起的 Webpack 构建流程学习指南
  7. Windows 与 Linux 通过Xshell 文件互传
  8. oracle,sqlserver,mysql区别
  9. Java语法基础----课后实践作业
  10. 深度学习TF—10.循环神经网络RNN及其变体LSTM、GRU实战
  11. 复试口语常见话题整理以及华师18 19年topic
  12. 数字化图书馆软硬件环境要求-转自《博奥智源》
  13. cad2012打开后闪退_windows7打不开CAD2012出现闪退的解决方法
  14. 华东交通大学计算机调剂,【通知】华东交通大学2020年硕士研究生调剂通知
  15. 羽毛球社团php,羽毛球兴趣小组计划
  16. QQ聊天机器人--基于酷Q写的插件
  17. QT5+zint库实现条形码条形码(一)
  18. 自己解决个税申报的步骤
  19. PhotoshopCS6外挂滤镜安装
  20. 为自己的snap应用添加变量

热门文章

  1. [bzoj] 1597 土地购买 || 斜率优化dp
  2. 华为员工自曝百万级年终奖,论坛征女友!
  3. Linux如何ping本机IP,Linux ping6 本地ipv6地址无效的参数
  4. lfs linux 教程,用LFS从零开始构建完整Linux系统
  5. 游戏中的网络同步机制——Lockstep(转载)
  6. html5闪光效果,css特效-一道闪光在图片上划过
  7. 【jzoj2163】【二分】算法学习(sfxx)
  8. google语音搜索识别API【转载】
  9. 网络最大流中一般增广路算法(标号法)
  10. 用java编写一个美元汇率转换,编写一个人民币和美元的双向汇率转换程序,实现美元和人民币转换,汇率:1美元=6.92人民币...