java堆栈_线上Java系统性能问题排查基本思路
⼀、常见Java 系统线上性能问题
中⼼的Java Web项⽬基本上都是使⽤ Tomcat 容器来部署的,在系统的⽇常运⾏过程中,我们可能会遇到各种性能问题,如:
●  OutOfMemoryError可⽤内存不⾜
●  OutOfMemory内存溢出
●  线程死锁
●  线程消耗⼤量 CPU资源grep命令查看进程
●  ......
这些性能问题的发⽣有特定的触发条件,在开发测试过程中不会经常或⼀定出现,容易被开发和测试⼈员忽视。但是这些问题基本上⼜是程序代码原因导致的,不是重启服务器或者提⾼资源的配置就能彻底解决的。所以,当线上系统出现这些性能问题时,就需要根据系统当前上下⽂环境定位到问题原因,排查出问题代码。
⼆、线上 Java 系统性能问题排查思路
这⾥使⽤⼀个简单的Java 死循环程序为例进⾏说明,如何排查性能问题代码。新建 Java 程序 JvmTes.java,定义⽅法 jvm(),⽅法内容为⼀个 while(true)死循环,当程序执⾏到 jvm ⽅法内后,会不停执⾏ while 语句块中的内容进⾏计数, 结果就是占⽤⼤量CPU资源。⽰例代码如下:
►第⼀步:出应⽤系统对应的Java 进程
可以使⽤ ps 或者jps 命令,根据Tomcat 或者⾃⼰的应⽤名称进⾏搜索。这⾥使⽤ jps 命令进⾏查Tomcat 容器进程,对应命令格式如下:
jps -v | grep [程序名称]
执⾏jps命令后得到应⽤程序的进程 id为 28528。
►第⼆步:出应⽤系统Java进程内的问题线程
使⽤top 命令,根据消耗性能的⾼低进⾏排序,到占⽤ CPU 资源最多、时间最长的线程,并记录对应的线程 id:这个线程⼀般就是导致CPU 使⽤率⾼、内存使⽤不⾜,或者线程死锁的原因。top 命令对应格式如下,其中 pid 为进程 id:
top -Hp pid
这⾥得到进程 id 为 28570。
►第三步:将问题线程 id 转换为⼗六进制
top 命令输出的线程 ID 为⼗进制,需要使⽤ printf 命令将将其转换为⼗六进制表⽰,命令格式如下:
printf "%x\n" 28570
printf 命令执⾏后得到输出结果为620f。
►第四步:根据线程堆栈信息出问题代码
使⽤ jstack 命令,根据问题进程ID和⼗六进制的问题线程 ID 进⾏grep,输出具体的堆栈信息。命令如下,其中 pid 为进程 id,tid 为线程id:
jstack pid | grep tid
从线程堆栈信息中即可以看出问题代码的具体位置。
jstack 是 JDK 提供的开发⼯具包中的命令,可⽤于查看 Java 进程内的线程堆栈信息。这⾥也可以使⽤ jstack 命令将线程堆栈信息 dump 到指定⽂件中,在线下使⽤其他⼯具载⼊ dump ⽂件进⾏分析,命令格式如下,其中 pid 为进程 id:
jstack -l pid > jstack.log
除此之外,还可以配置
-XX:+HeapDumpOnOutOfMemoryError 参数,在Java程序内存溢出时⾃动将线程堆栈信息输出 dump ⽂件。
三、Java性能排查相关⼯具
除了 jstack ⼯具外,这⾥再简单介绍⼏种常见的 Java性能分析⼯具:
➭jinfo 命令,⽤来查看和调整 JVM 设置的各项参数。
➭jmap命令,⽤于⽣成堆转储快照,可以使⽤该命令查看进程堆内存的使⽤情况,包括JVM 使⽤的 G
C 算法、堆配置参数和各代中堆内存的使⽤情况。此外,也可以使⽤ jmap ⼯具把进程内存导出到⽂件中,再结合其他⼯具进⾏分析查看。
➭jhat ⼯具,和 jmap 搭配使⽤,使⽤ jhat ⼯具分析jmap 导出来的堆快照⽂件。
➭jconsole图形界化⼯具,可以⽤在本地开发环境排查性能问题。
➭jvisualvm图形界化⼯具:图形化显⽰线程信息、内存区块和 GC使⽤情况,可⽤在开发环境排查性能问题。
➭jstat:JVM 统计信息监测⼯具,可以使⽤该⼯具查看分析各区内存使⽤和 GC 情况。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。