http://hellojava.info/

问题排查除了最重要的解决思路和逻辑推导能力外,工具也是不可缺少的一部分,一个好用的工具可以事半功倍,甚至在某些情况下会因为没有相应的工具而压根就没法继续进行下去,这篇文章就来讲讲在排查Java问题时通常要用到的一些工具(ps:这种文章值得收藏,看一遍其实很容易忘)。

日志相关工具
查问题的时候会非常依赖日志,因此看日志的相关工具非常重要,通常的话掌握好tail,find,fgrep,awk这几个常用工具的方法就可以,说到这个就必须说关键的异常和信息日志输出是多么的重要(看过太多异常的随意处理,例如很典型的是应用自己的ServletContextListener实现,很多的Listener实现都会变成往外抛RuntimeException,然后直接导致tomcat退出,而tomcat这个时候也不会输出这个异常信息,这种时候要查原因真的是让人很郁闷,尽管也有办法)。
日志的标准化也非常重要,日志的标准化一方面方便像我这种要查各种系统问题的人,不标准的话连日志在哪都找不到;另一方面对于分布式系统而言,如果标准化的话是很容易做日志tracing的,对问题定位会有很大帮助。

CPU相关工具
碰到一些CPU相关的问题时,通常需要用到的工具:
top (-H)
top可以实时的观察cpu的指标状况,尤其是每个core的指标状况,可以更有效的来帮助解决问题,-H则有助于看是什么线程造成的CPU消耗,这对解决一些简单的耗CPU的问题会有很大帮助。
sar
sar有助于查看历史指标数据,除了CPU外,其他内存,磁盘,网络等等各种指标都可以查看,毕竟大部分时候问题都发生在过去,所以翻历史记录非常重要。
jstack
jstack可以用来查看Java进程里的线程都在干什么,这通常对于应用没反应,非常慢等等场景都有不小的帮助,jstack默认只能看到Java栈,而jstack -m则可以看到线程的Java栈和native栈,但如果Java方法被编译过,则看不到(然而大部分经常访问的Java方法其实都被编译过)。
pstack
pstack可以用来看Java进程的native栈。
perf
一些简单的CPU消耗的问题靠着top -H + jstack通常能解决,复杂的话就需要借助perf这种超级利器了。
cat /proc/interrupts
之所以提这个是因为对于分布式应用而言,频繁的网络访问造成的网络中断处理消耗也是一个关键,而这个时候网卡的多队列以及均衡就非常重要了,所以如果观察到cpu的si指标不低,那么看看interrupts就有必要了。

内存相关工具
碰到一些内存相关的问题时,通常需要用到的工具:
jstat
jstat -gcutil或-gc等等有助于实时看gc的状况,不过我还是比较习惯看gc log。
jmap
在需要dump内存看看内存里都是什么的时候,jmap -dump可以帮助你;在需要强制执行fgc的时候(在CMS GC这种一定会产生碎片化的GC中,总是会找到这样的理由的),jmap -histo:live可以帮助你(显然,不要随便执行)。
gcore
相比jmap -dump,其实我更喜欢gcore,因为感觉就是更快,不过由于某些jdk版本貌似和gcore配合的不是那么好,所以那种时候还是要用jmap -dump的。
mat
有了内存dump后,没有分析工具的话然并卵,mat是个非常赞的工具,好用的没什么可说的。
btrace
少数的问题可以mat后直接看出,而多数会需要再用btrace去动态跟踪,btrace绝对是Java中的超级神器,举个简单例子,如果要你去查下一个运行的Java应用,哪里在创建一个数组大小>1000的ArrayList,你要怎么办呢,在有btrace的情况下,那就是秒秒钟搞定的事,:)
gperf
Java堆内的内存消耗用上面的一些工具基本能搞定,但堆外就悲催了,目前看起来还是只有gperf还算是比较好用的一个,或者从经验上来说Direct ByteBuffer、Deflater/Inflater这些是常见问题。
除了上面的工具外,同样内存信息的记录也非常重要,就如日志一样,所以像GC日志是一定要打开的,确保在出问题后可以翻查GC日志来对照是否GC有问题,所以像-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc: 这样的参数必须是启动参数的标配。

ClassLoader相关工具
作为Java程序员,不碰到ClassLoader问题那基本是不可能的,在排查此类问题时,最好办的还是-XX:+TraceClassLoading,或者如果知道是什么类的话,我的建议就是把所有会装载的lib目录里的jar用jar -tvf *.jar这样的方式来直接查看冲突的class,再不行的话就要呼唤btrace神器去跟踪Classloader.defineClass之类的了。

其他工具
jinfo
Java有N多的启动参数,N多的默认值,而任何文档都不一定准确,只有用jinfo -flags看到的才靠谱,甚至你还可以看看jinfo -flag,你会发现更好玩的。
dmesg
你的java进程突然不见了? 也许可以试试dmesg先看看。
systemtap
有些问题排查到java层面是不够的,当需要trace更底层的os层面的函数调用的时候,systemtap神器就可以派上用场了。
gdb
更高级的玩家们,拿着core dump可以用gdb来排查更诡异的一些问题。

io类型的问题我排查的很少,所以尽管知道一些工具,还是不在这里写了。

暂时就写这些,尽管工具的使用多数都可以临时学,但首先知道有哪些工具是最重要的,然后呢还是建议大家可以玩一玩这些工具,这样以后真的要用的时候也不至于一点印象都没有。

转载于:https://www.cnblogs.com/davidwang456/articles/9444285.html

Java问题排查工具箱相关推荐

  1. java 故障排查_目前最全的 Java 服务问题排查套路

    问题分类: CPU问题 内存问题(GC问题.内存泄漏. OOM,Coredump 等) I/O问题 问题排查工具箱: 系统级别的工具: top:查看系统/进程cpu.内存.swap等资源占用情况的必备 ...

  2. java btrace_BTrace:Java开发人员工具箱中的隐藏宝石

    java btrace 这篇文章是关于BTrace的 ,我正在考虑将其作为Java开发人员的隐藏宝藏. BTrace是用于Java平台的安全,动态跟踪工具. BTrace可用于动态跟踪正在运行的Jav ...

  3. BTrace:Java开发人员工具箱中的隐藏宝石

    这篇文章是关于BTrace的 ,我正在考虑将其作为Java开发人员的隐藏宝藏. BTrace是用于Java平台的安全,动态跟踪工具. BTrace可用于动态跟踪正在运行的Java程序(类似于DTrac ...

  4. linux下java多线程_Linux系统下Java问题排查——cpu使用率过高或多线程锁问题

    原标题:Linux系统下Java问题排查--cpu使用率过高或多线程锁问题 一个系统.特别是多线程并发的后台系统,在某些特定场景下,可能触发系统中的bug:导致cpu一直居高不下.进程hang了或处理 ...

  5. Java调试--排查类工具

    原文网址:Java调试--排查类工具_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java调试相关的命令. jps 简介 查看基于HotSpot的JVM里面中,所有具有访问权限的Java进程的具体 ...

  6. 阿里员工的Java问题排查工具单

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:红魔七号 链接:https://yq.aliyun.com/ ...

  7. Java问题排查工具清单!

    来源:https://yq.aliyun.com/articles/69520 前言 平时的工作中经常碰到很多疑难问题的处理,在解决问题的同时,有一些工具起到了相当大的作用,在此书写下来,一是作为笔记 ...

  8. Java问题排查工具清单

    作者:红魔七号 https://yq.aliyun.com/articles/69520 前言 平时的工作中经常碰到很多疑难问题的处理,在解决问题的同时,有一些工具起到了相当大的作用,在此书写下来,一 ...

  9. java 故障排查_java线上服务问题排查

    1.业务日志相关 如果应用系统出现异常,一般都会在业务日志中体现 统计当天业务日志中ERROR出现数量:egrep ERROR --color logname | wc -l  ,如果错误数量过大,一 ...

最新文章

  1. Knowledge Point 20180305 数据在计算机中的表示
  2. 日期在数据库的存储和取出
  3. SQL2008修改并保存表结构时报错的解决(阻止保存要求重新创建表的更改)
  4. java 过滤器(参数传递中文乱码)
  5. Numpy 模块的使用
  6. HTML5浪漫生日祝福电子贺卡网页模板(HTML5+CSS3+JS)_520表白/七夕情人节表白/告白网页制作/生日快乐html模板
  7. 世界各国(地区)货币名称及其进位制
  8. 手机里的照片导入计算机的方法,苹果手机照片怎么传到电脑_苹果手机照片传到电脑教程-太平洋IT百科手机版...
  9. 魔方cfop公式软件_【番外篇】八大魔方快速还原法图解介绍汇总大全!
  10. 省份和城市的级联下拉菜单
  11. Matlab坐标轴标签中文设置宋体,英文设置新罗马字体(Times New Roman)
  12. 解决训练时显存不断增大问题
  13. 5G网元结构和协议栈
  14. Elasticsearch7.x证书过期简单解决方法
  15. 不惧变化 抓住机遇 | A+CLUB 8月深圳站
  16. 还在买鲜花送女神?手把手教你搭建3D立体相册网站,包女神稀饭
  17. 如何查看目前所有会话的状态oracle,Oracle一些常用查看数据库状态SQL
  18. Ceph RGW高可用HA集群keepalived+Haproxy
  19. linux zend studio 10,Zend Studio 10发布,可编写mobile apps
  20. 如何使用JS的排序函数sort()

热门文章

  1. 《剑指offer》c++版本 7.重建二叉树
  2. IPv6扩展头部 (三) 路由头部 Routing Header for IPv6
  3. 静态服务器显示固定页面,【Python高级编程034 ● 静态web服务器 ● 静态Web服务器-返回固定页面数据】...
  4. android 共享数据,android进程间共享简单数据
  5. 罗斯霍曼理工学院计算机毕业生,全美最强STEM大学,了解一下?
  6. java从键盘输入数据斐波那契数_从键盘输入一个正整数n,打印出斐波那契数列的前n个元素...
  7. wps 模拟分析 规划求解_Excel数据分析两大利器,趋势预测与规划求解
  8. php不能加载oci8,无法加载动态库'oci8.so'(PHP 7.2)
  9. 利用邮箱实现数据通信
  10. StringBuilder类