线上问题处理思路

线上问题处理(简单记录下,提供思路,喜欢的自己去深入)


常用基础命令,这些命令不会很详细,自行网上查询

  • jps

    说明:列出正在运行的java虚拟机进程。就是看现在系统里面运行了几个java程序。

    参数:

-q:只输出进程 ID -m:输出传入 main 方法的参数 -l:输出完全的包名,应用主类名,jar的完全路径名 -v:输出jvm参数 -V:输出通过flag文件传递到JVM中的参数

个人理解,这些参数主要是为了让你确认你起的是哪个java程序,不至于弄错。

线上问题处理思路_第1张图片

  • jstat

    说明:用于监视虚拟机各种运行状态信息的工具。比如监控垃圾收集,类装载,运行期编译状况。

具体使用可以参照 https://www.cnblogs.com/bbox/p/9750361.html这个文档上的

  • jinfo

说明:查看和调整虚拟机的各项参数.但不是每个jvm的参数都可以修改的。

命令格式:

jinfo -flag [+/-]name pid 或者 jinfo -flag name=value pid,进行调整

jinfo -flags pid,查看jvm参数

还有其他的很多,自行网上查询

线上问题处理思路_第2张图片

比如上面图片,

  1. 通过jinfo -flags 1124 命令,看1124java进程里面的jvm参数,其中PrintGCDetails是开启的

  2. 通过jinfo -flag -PrintGCDetails 1124 调整这个参数,把它给关掉,不让开启

  3. 通过jinfo -flag +PrintGC 1124 把PrintGC给开启

  • jmap

说明:生成堆快照。可以理解成,看你内存里面哪些class占用了多大内存。可以用来看分析一些内存溢出或者内存泄漏等导致内存比较高的问题。

命令格式:jmap -dump:format=b,file=jmap1log 1124 这是比较常用的

还有其他参数自行网上查询或者通过jmap --help 或者man jmap去查看

线上问题处理思路_第3张图片

jmap导出堆快照的命令是 jmap -dump: pid

比如jmap -dump:format=b,file=jmap1log 1124 ,这个format=b,意思是导出成二进制文件,file=jmap1log是指文件的名字,这个名字随便起,后面的1124是指java进程号,用jps命令查看的

  • jhat

主要是分析出jmap命令导出的文件,这个不做说明。分析jamp导出的文件,可以用Eclipse Memory Analyzer MAT或者Visual VM。

  • jstack

用于生成虚拟机当前时刻的线程快照,一般称为threaddump或者javacore文件。线程快照就是指当前虚拟机每一条线程正在执行的方法的堆栈的集合,用来分析响应慢或者线程死锁的这种状态。

命令格式:jstack -l 1124

线上问题处理思路_第4张图片

通过jstack -l 1124 是直接在控制台显示的,这个如果不方便看,可以把他输入都文件里面


根据demo去分析问题

demo下载地址

https://download.csdn.net/download/gaoyefeng/12443396

可以看看这个jvmDemo的程序,主要是写了一些代码让CPU,以及内存升高,还有响应变慢

  • 高CPU

  1. 先启动程序,通过jsp -l 查看我们启动的jvmDemo程序的进程号

    线上问题处理思路_第5张图片

  2. http://192.168.1.190:8080/jvm/high/cpu?name=test 调用我们程序,让CPU升起来

  3. 通过top命令可以看到占用CPU99%的java进程号为2377,这个和jps -l打印的java进程号是一样的

    线上问题处理思路_第6张图片

  4. 通过top -H -p 2377,打印出这个进程里面最占CPU的线程号,为2442

    线上问题处理思路_第7张图片

  5. 通过 jstack -l 2377 >> jstack1.log 打印出线程快照,然后分析(这个生成的文件的位置,是你当前文件位置,简单就是通过pwd 命令看你的目录是哪,生成的文件就在这个目录下)

  6. 把4找到的最占CPU的线程号2422,转成16进制为)OX98A,去5生成的jstack1.log日志搜,能看到对应的方法堆栈,通过代码去查就行了

线上问题处理思路_第8张图片

  • 高内存

  1. 启动程序,通过jps -l查看我们启动的进程号为2556

  2. 调用http://192.168.1.190:8080/jvm/high/mem?name=test,让内存一直增加

  3. 通过top命令会发现,这个java程序占用的内存一直在增加,这个时候我们需要通过jamp导出内存日志去分析了

  4. 通过命令jmap -dump:format=b,file=jmap1log 2556 导出内存日志,然后下载下来,我这边是通过mat分析,就上面说的Eclipse Memory Analyzer

  • 响应变慢

    分几种情况,高CPU和内存泄漏导致的,进程间锁住,数据库锁等

    如果是进程间锁住的话,可以通过jstack打印线程dump去分析

    jstack日志分析

    https://www.cnblogs.com/pc-boke/articles/9099029.html


可视化工具

  • 启动参数增加

java -Djava.rmi.server.hostname=172.23.22.243 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar jvmDemo-0.0.1-SNAPSHOT.jar

  • jconsole.exe

  • jvisualvm.exe


阿里开源工具

arthas ,自己看文档吧,功能还比较强大,只讲一个watch。强烈推介,真的强大

https://alibaba.github.io/arthas/

  • watch

可以通过 watch --help去看命令

watch com.gg.jvmDemo.controller.JvmDemoController normalCall returnObj

 

你可能感兴趣的:(线上问题处理思路)