Java线上常见问题排查方法

文章目录

  • CPU问题
  • 内存问题
  • 网络问题

CPU问题

cpu问题是比较常见的问题,cpu负载过高会导致系统接口卡顿,响应变慢,对于造成cpu过高的大致有以下几种情况。

  • JVM频繁GC导致cpu高。
  • 存在死循环,导致cpu负载过高。
  • 执行其他消耗cpu多的操作,比如打印过多的debug日志,循环过多。

在实际开发中,遇到比较多的是频繁gc,尤其是频繁Full GC导致cpu过高。频繁Full GC主要由以下几种情况。

  • 老年代空间不足
  • metaspace方法区空间不足
  • System.gc()

针对cpu过高的常用排查方法由:

  1. 使用arthas 查看占比cpu高的线程 thread -n 3 -i 1000
  2. Github开源脚本show-busy-java-threads显示占用cpu高的线程。
  3. ps -mp pid -o THREAD,tid,time | sort -k2r 查看进程占用cpu高的线程。该命令消耗cpu少。
  4. ps -mp pid -o THREAD,tid,time | head -n 40 查看进程占用cpu高的前几个线程。
  5. top定位cpu高的线程,top -Hp -p pid 定位使用 CPU 最高的线程,线程 id 转化 16 进制 printf ‘%x\n’ pid 得到 nid ,jstack pid |grep ‘nid’ 注意nid前面一般要加0x找到线程堆栈。步骤多,grep的时候可能匹配到很多,不方便查找。jstack pid 打印线程堆栈,分析日志。
  6. cat jstack.log | grep “java.lang.Thread.State” | sort -nr | uniq -c 分析线程状态,如果WAITING BLOCKED 过多则很可能代码有问题。
  7. arthas profiler生成火焰图 火焰图主要看顶层的哪个函数占据的宽度最大。只要有"平顶"(plateaus),就表示该函数可能存在性能问题。

内存问题

内存问题也是比较常见的问题,内存问题主要是包含OOM问题,GC问题和堆外内存,StackOverflow等常见问题。

针对内存问题主要的排查方法:

  1. top free 可以查看实时的内存使用情况 。
  2. jmap -heap pid 输出当前进程 JVM 堆新生代、老年代、持久代等请情况,GC 使用的算法等信息。
  3. arthas dashboard 查看JVM内存占用情况。
  4. jmap -J-d64 -dump:format=b,file=dumpfile.hprof [pid],打印内存快照 然后利用MAT工具分析,64位机器加-J-d64,否则生成的dump文件会打开不了。
  5. jstat -gc pid 查看内存gc情况。
  6. jmap -histo pid | sort -n -r -k 3 | head -20 查看内存占用前20的对象。

对于堆内存问题,需要开启gc日志,查看gc情况。对于堆外内存溢出一般我们先通过pmap来查看下进程占用的内存情况pmap -x pid | sort -rn -k3 | head -30,这段意思是查看对应pid倒序前30大的内存段。

网络问题

经常遇到cpu跟内存都正常,但是应用程序假死,没有响应。这个时候很可能是网络问题,比如阻塞住,线程大量处于WAITING 状态。tcp连接超时,连接溢出等问题。

常见排查网络问题方法:

  1. netstat -n|awk ‘/^tcp/{++S[$NF]}END{for (key in S) print key,S[key]}’ 查看当前系统下所有连接状态的数。
  2. netstat -s | egrep “listen|LISTEN”。
  3. jstack pid >> jstack.log 打印线程堆栈排查问题。

网络问题主要是查看tcp连接状态,应用线程堆栈线程状态,从而进一步确定问题。

参考资料:https://blog.csdn.net/itfly8/article/details/118865589

你可能感兴趣的:(java,java并发,java,tcp/ip)