线上java问题排查

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/unix21/article/details/79093784

0.jps

这个输出java进程pid

#jps


查看java的线程

#top -Hp 25448


如图25757这个线程比较耗时,看看他在做什么


注意需要折算出线程pid的16进制值,然后jstack。

可以打印更多信息

#jstack pid | grep -A 20 649d


参考:JVM调优之jstack找出最耗cpu的线程并定位代码

top+jstack分析cpu过高原因


1.jstack

#jstack -l pid > jstack.log

使用jstack命令输出这一时刻的线程栈

jstack线程分析

jstack日志深入理解


2.jmap

#jmap -dump:format=b,file=heapDump 6900

#jmap -dump:live,format=b,file=dump.bin  6900

-dump:[live,]format=b,file=<filename> 使用hprof二进制形式,输出jvm的heap内容到文件=. 
live子选项是可选的,假如指定live选项,那么只输出活的对象到文件. 

Java命令学习系列(3):Jmap

jmap查看堆内存大小

#jmap -heap  pid

注意:jmap使用的时候jvm是处在停顿状态的,只能在服务不可用的时候为了解决问题来使用,否则会造成服务中断。


使用jmap -histo[:live] pid查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象,如下:
# jmap -histo:live pid | more



需要使用MAT工具分析jmap dump的内存

使用jmap和MAT分析JVM堆内存


3.jstat

jstat -gcutil pid

250毫秒一次采样4次


可以看出:
堆内存 = 年轻代 + 年老代 + 永久代
年轻代 = Eden区 + 两个Survivor区(From和To)

现在来解释各列含义:
S0C、S1C、S0U、S1U:Survivor 0/1区容量(Capacity)和使用量(Used)
EC、EU:Eden区容量和使用量
OC、OU:年老代容量和使用量
PC、PU:永久代容量和使用量
YGC、YGT:年轻代GC次数和GC耗时
FGC、FGCT:Full GC次数和Full GC耗时
GCT:GC总耗时
E、hprof(Heap/CPU Profiling Tool)

4.gcore

#gdb -q --pid=1990

(gdb) generate-core-file
(gdb) detach
(gdb) quit
jmap -dump:format=b,file=heap.hprof /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java core.1990 

需要具体jdk对应的bin/java

参考:

gcore 获取程序core dump file 但程序不用退出,gdb 分析core

java程序性能分析之thread dump和heap dump


5.堆外内存泄露分析

top出来java占用内存极大而jmap出来的很小,说明有堆外内存泄露。

参考Java堆外内存泄露分析


综合使用参考: JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解

JVM性能调优监控工具专题一:JVM自带性能调优工具(jps,jstack,jmap,jhat,jstat,hprof)

JVM性能调优监控工具专题二:VisualVM基本篇之监控JVM内存,CPU,线程

猜你喜欢

转载自blog.csdn.net/unix21/article/details/79093784