线上java问题排查
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,線程
總結
以上是生活随笔為你收集整理的线上java问题排查的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用“逐步排除”的方法定位Java服务线上
- 下一篇: Linux kernel futex.c