Java应用线上问题排查的常用工具和方法

  在长期排查线上问题的过程中,总结了一些工具的用法和排查问题的思路,这里跟大家分享一下,在遇到类似的问题时,希望能给予一些帮助。

  首先讲讲工具, jvm 自带的一些工具是必须熟练掌握的,例如jstack, jmap, jstat等,它们可以帮我们去深入了解JVM正在做的事情,主要的适用领域有这些:

1、jstack

  jstack可以告诉你当前所有JVM线程正在做什么,包括用户线程和虚拟机线程,你可以用它来查看线程栈,并且结合Lock信息来检测是否发生了死锁和死锁的线程。

  没事儿jstack一下,知道你的小伙伴正在做什么。

  另外在用top -H看到占用CPU非常高的pid时,可以转换成16进制后在jstack dump出来的文件中搜索,看看到底是什么线程占用了CPU。

2、jstat

  stat,顾名思义就是提供一些统计信息,它可以告诉你当前的GC情况,包括GC次数、时间,具体的GC还可以结合gc.log文件去分析。

  一般来说,我们用jstat去查看GC情况,判断是否存在YGC或FGC频繁的情况,再去看gc.log和jamp dump内存,MAT分析来定位问题(后面会有一个case针对这种场景)。

  常用的用法是jstat -gcutil pid time_interval

3、jmap

  排查GC问题必然会用到的工具,jmap可以告诉你当前JVM内存堆中的对象分布及其关系,当你dump堆之后可以用MAT分析,看看有哪些大对象,或者哪些类的实例特别多。

  常用用法:

  强制FGC:-histo:live

  dump堆:-dump:[live],format=b,file=dump.bin

  查看各代内存占用情况:-heap

  然后我们来介绍一些开源的工具,来增强JVM工具本身的作用。

4、top

  这个是 linux 自带的命令,查看系统资源消耗情况,可以看看CPU、内存、SWAP、I/O的消耗情况,需要特别注意的有几个值:

  ni,这个值如果特别高说明线程上下文切换开销较大,看看是不是开了太多的线程导致的

  res,这个代表了进程实际占用的内存

  swap,内存不足就会占用swap空间,这个时候一般应用的性能会急剧下降,需要特别关注

时间: 2024-08-07 11:41:42

Java应用线上问题排查的常用工具和方法的相关文章

java应用线上CPU过高问题排查

1.top 命令,查看占用CPU最高的PID.ps aux|grep PID 进一步确定tomcat进程出现问题.2.ps -mp pid -o THREAD,tid,time显示线程列表3.printf "%x\n" tid 线程ID转换为16进制格式.4.jstack pid | grep tid -A 30 打印线程的堆栈信息5.pstack 查看某个进程的当前线程栈运行情况

java:线上问题排查常用手段

一.jmap找出占用内存较大的实例 先给个示例代码: import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; /** * Created by 菩提树下的杨过 on 05/09/2017. */ public class OOMTest { public static void main(String[] args) throws InterruptedExcep

微服务应用线上性能分析

每天线程数在16:12增加,后通过jmx监控程序为,微服务业务线程增加,因为多个业务几乎每个业务统一时间16:12线程数 增加后,tp99狂飙1000倍,在系统工程师支持下查到为线上16:12执行磁盘清理文件,停止后系统线程数正常,tp99正常. 其中的一个应用平时线程数也会超过400个平时为80/90后观察到和fullgc强相关,后续需要调整gc算法避免暂停时间 过长导致线程数增加. 总结应用请求数越多,外部比如fullgc.外部程序执行比如清理磁盘程序对程序的影响越大,这时候需要尽量避免在业

java向图片上写字,两个图片合并的方法

package writeimg; import javax.imageio.ImageIO; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.net.URL; public class pic { pri

Web_telnet 通过JAVA实现网页上面的命令行远程工具 以及对于流的理解

前言 这几天研究了一下如何在web页面上通过telnet 连接一个远程的机器,通过命令行进行控制,让然,B/S架构的项目,如果直接通过 浏览器是无法和远程机器进行通信的,我们就得借助后端来帮助实现这样的一个功能需求,具体的实现逻辑是: 用户————>控制浏览器命令行界面————>发送命令到后端服务器————>后端服务器连接socket————>推送用户的命令 telnet Server ————>后端服务器输入流接受返回字符——————>websocket 推送到前端完

js常用工具类.

一些js的工具类 复制代码 /** * Created by sevennight on 15-1-31. * js常用工具类 */ /** * 方法作用:[格式化时间] * 使用方法 * 示例: * 使用方式一: * var now = new Date(); * var nowStr = now.dateFormat("yyyy-MM-dd hh:mm:ss"); * 使用方式二: * new Date().dateFormat("yyyy年MM月dd日");

Java架构师线上问题排查,这些命令程序员一定用得到!

Java架构师线上问题排查,这些命令程序员一定用得到! 线上问题排查,以下场景,你遇到过吗? 一.了解机器连接数情况 问题:1.2.3.4的sshd的监听端口是22,如何统计1.2.3.4的sshd服务各种连接状态(TIME_WAIT/ CLOSE_WAIT/ ESTABLISHED)的连接数. 常见方法: · netstat -n | grep 1.2.3.4:22 | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' · nets

Java面试题上

1.面向对象的特征有哪些方面?答:面向对象的特征主要有以下几个方面:- 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么.- 继承:继承是从已有类得到继承信息创建新类的过程.提供继承信息的类被称为父类(超类.基类):得到继承信息的类被称为子类(派生类).继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段(如果不能理解请阅读阎宏博士的<Java与模式>或<设计模式精

阿里巴巴Java开发手册上常规的编程命名总结

阿里巴巴Java开发手册上常规的编程命名总结:1.类名必须驼峰.例子:MarcoPolo / UserDO / XmlService / TcpUdpDeal / TaPromotion 2.方法名.参数名.成员变量.局部变量都统一使用 lowerCamelCase 风格,必须遵从驼峰形式.例子:localValue / getHttpMessage() / inputUserId 3.常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长.例子:MAX_STOCK_COUNT