线上java问题排查
0.jps
這個(gè)輸出java進(jìn)程pid
#jps
查看java的線程
#top -Hp 25448
如圖25757這個(gè)線程比較耗時(shí),看看他在做什么
注意需要折算出線程pid的16進(jìn)制值,然后jstack。
可以打印更多信息
#jstack pid | grep -A 20 649d
參考:JVM調(diào)優(yōu)之jstack找出最耗cpu的線程并定位代碼
top+jstack分析cpu過高原因
1.jstack
#jstack -l pid > jstack.log
使用jstack命令輸出這一時(shí)刻的線程棧
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二進(jìn)制形式,輸出jvm的heap內(nèi)容到文件=.?
live子選項(xiàng)是可選的,假如指定live選項(xiàng),那么只輸出活的對象到文件.?
Java命令學(xué)習(xí)系列(3):Jmap
jmap查看堆內(nèi)存大小
#jmap -heap ?pid
注意:jmap使用的時(shí)候jvm是處在停頓狀態(tài)的,只能在服務(wù)不可用的時(shí)候?yàn)榱私鉀Q問題來使用,否則會(huì)造成服務(wù)中斷。
使用jmap -histo[:live] pid查看堆內(nèi)存中的對象數(shù)目、大小統(tǒng)計(jì)直方圖,如果帶上live則只統(tǒng)計(jì)活對象,如下:
# jmap -histo:live pid | more
需要使用MAT工具分析jmap dump的內(nèi)存
使用jmap和MAT分析JVM堆內(nèi)存
3.jstat
jstat -gcutil pid
250毫秒一次采樣4次
可以看出:
堆內(nèi)存 = 年輕代 + 年老代 + 永久代
年輕代 = Eden區(qū) + 兩個(gè)Survivor區(qū)(From和To)
現(xiàn)在來解釋各列含義:
S0C、S1C、S0U、S1U:Survivor 0/1區(qū)容量(Capacity)和使用量(Used)
EC、EU:Eden區(qū)容量和使用量
OC、OU:年老代容量和使用量
PC、PU:永久代容量和使用量
YGC、YGT:年輕代GC次數(shù)和GC耗時(shí)
FGC、FGCT:Full GC次數(shù)和Full GC耗時(shí)
GCT:GC總耗時(shí)
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對應(yīng)的bin/java
參考:
gcore 獲取程序core dump file 但程序不用退出,gdb 分析core
java程序性能分析之thread dump和heap dump
5.堆外內(nèi)存泄露分析
top出來java占用內(nèi)存極大而jmap出來的很小,說明有堆外內(nèi)存泄露。
參考Java堆外內(nèi)存泄露分析
綜合使用參考:?JVM性能調(diào)優(yōu)監(jiān)控工具jps、jstack、jmap、jhat、jstat、hprof使用詳解
JVM性能調(diào)優(yōu)監(jiān)控工具專題一:JVM自帶性能調(diào)優(yōu)工具(jps,jstack,jmap,jhat,jstat,hprof)
JVM性能調(diào)優(yōu)監(jiān)控工具專題二:VisualVM基本篇之監(jiān)控JVM內(nèi)存,CPU,線程
總結(jié)
以上是生活随笔為你收集整理的线上java问题排查的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用“逐步排除”的方法定位Java服务线上
- 下一篇: Linux kernel futex.c