java服務排查bug流程

java內存問題

java線程數估算

JVM最大創建線程數量:
1. JVM堆內存大小;
2. 線程的Stack內存大小;
3. 系統最大可創建線程數(Java線程的實現是基於底層系統的線程機制來實現的,Windows下_beginthreadex,Linux下pthread_create)三個方面影響。具體如下:

-Xms  最小堆內存
-Xmx  最大堆內存
-Xss   設置每個線程的堆棧大小。JDK5.0以後每個線程堆棧大小爲1M
操作系統限制 系統最大可開線程數,主要受以下幾個參數影響

/proc/sys/kernel/pid_max
/proc/sys/kernel/thread-max
max_user_process(ulimit -u) 在64位Linux系統(CentOS 6, 3G內存)下測試,發現還有一個參數是會限制線程數量:max user process(可通過ulimit –a查看,默認值1024,通過ulimit –u可以修改此值),這個值在上面的32位Ubuntu測試環境下並無限制

查看java進程的cpu和內存情況。

  1. java進程佔用cpu情況
//top 查看cpu佔用高的進程

jps 查看所有的java進程

jmap 查看java進程的內存情況(使用情況)
  1. 查看進程下的哪個線程佔用高
top -Hp pid
  1. 將其pid轉成16進制
printf '%x\n' pid
  1. jstack打印線程信息
jstack pid | grep '16進制' -A 50 --color

能看出來此線程的執行情況了。

查看gc日誌

young (eden, from,to) --》 old區 --》 perm區持久區

  1. java啓動加上如下參數:
-XX:+PrintGC 輸出GC日誌
-XX:+PrintGCDetails 輸出GC的詳細日誌
-XX:+PrintGCTimeStamps 輸出GC的時間戳(以基準時間的形式)
-XX:+PrintGCDateStamps 輸出GC的時間戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC 在進行GC的前後打印出堆的信息
-Xloggc:../logs/gc.log 日誌文件的輸出路徑
-XX:+User..GC

項目實戰用法demo:

-verbose:gc 
-XX:+PrintGCDetails  
-XX:+PrintGCDateStamps 
-XX:MetaspaceSize=100m 
-Xloggc:/data/apps/log/kefu/KefuLiteGateway/KefuLiteGateway-gc.log 
-XX:+UseGCLogFileRotation 
-XX:NumberOfGCLogFiles=10 
-XX:GCLogFileSize=10M
  1. 日誌如何查看

Java中的GC有哪幾種類型?

/**
 * 虛擬機運行在Client模式的默認值,打開此開關參數後,
使用Serial+Serial Old收集器組合進行垃圾收集。
 * /
UseSerialGC

/**
 * 打開此開關參數後,使用ParNew+Serial Old收集器組合進行垃圾收集。
 * /
UseParNewGC

/**
 * 打開此開關參數後,使用ParNew+CMS+Serial Old收集器組合進行垃圾收集。Serial Old作爲CMS收集器出現Concurrent Mode Failure的備用垃圾收集器。
 * /
UseConcMarkSweepGC

/**
 * 虛擬機運行在Server模式的默認值,打開此開關參數後,使用Parallel Scavenge+Serial Old收集器組合進行垃圾收集。
 * /
UseParallelGC

/**
 * 打開此開關參數後,使用Parallel Scavenge+Parallel Old收集器組合進行垃圾收集。
 * /
UseParallelOldGC
  • 新生代gc
對於新生代回收的一行日誌,其基本內容如下:

2014-07-18T16:02:17.606+0800: 611.633: [GC 611.633: [DefNew: 843458K->2K(948864K), 0.0059180 secs] 2186589K->1343132K(3057292K), 0.0059490 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

解釋:
2014-07-18T16:02:17.606+0800(當前時間戳): 611.633(時間戳): [GC(表示Young GC) 611.633: [DefNew(單線程Serial年輕代GC): 843458K(年輕代垃圾回收前的大小)->2K(年輕代回收後的大小)(948864K(年輕代總大小)), 0.0059180 secs(本次回收的時間)] 2186589K(整個堆回收前的大小)->1343132K(整個堆回收後的大小)(3057292K(堆總大小)), 0.0059490 secs(回收時間)] [Times: user=0.00(用戶耗時) sys=0.00(系統耗時), real=0.00 secs(實際耗時)]

如果gc回收事件real過長,則嚴重影響性能
  • 老年代回收的日誌如下:
2014-07-18T16:19:16.794+0800: 1630.821: [GC 1630.821: [DefNew: 1005567K->111679K(1005568K), 0.9152360 secs]1631.736: [Tenured:
2573912K->1340650K(2574068K), 1.8511050 secs] 3122548K->1340650K(3579636K), [Perm : 17882K->17882K(21248K)], 2.7854350 secs] [Times: user=2.57 sys=0.22, real=2.79 secs]
  1. 實戰demo
Java HotSpot(TM) 64-Bit Server VM (25.171-b11) for linux-amd64 JRE (1.8.0_171-b11), built on Mar 28 2018 17:07:08 by "java_re" with gcc 4.3.0 20080428 (Red Hat 4.3.0-8)
Memory: 4k page, physical 12138748k(928836k free), swap 0k(0k free)

CommandLine flags: -XX:GCLogFileSize=10485760 -XX:InitialHeapSize=536870912 -XX:MaxHeapSize=536870912 -XX:MetaspaceSize=104857600 -XX:NumberOfGCLogFiles=10 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseGCLogFileRotation -XX:+UseParallelGC


2020-06-04T13:57:53.040+0800: 507498.042: [GC (Allocation Failure) [PSYoungGen: 168832K->4451K(169472K)] 314972K->151104K(519168K), 0.0275453 secs] [Times: user=0.05 sys=0.00, real=0.02 secs] 
2020-06-04T15:49:27.289+0800: 514192.292: [GC (Allocation Failure) [PSYoungGen: 168803K->4400K(169472K)] 315456K->151300K(519168K), 0.0392701 secs] [Times: user=0.05 sys=0.00, real=0.03 secs] 
2020-06-04T17:40:56.462+0800: 520881.465: [GC (Allocation Failure) [PSYoungGen: 168752K->4448K(169472K)] 315652K->151532K(519168K), 0.0291720 secs] [Times: user=0.04 sys=0.00, real=0.03 secs] 
2020-06-04T19:32:30.924+0800: 527575.927: [GC (Allocation Failure) [PSYoungGen: 168800K->4464K(169472K)] 315884K->151740K(519168K), 0.0284578 secs] [Times: user=0.05 sys=0.00, real=0.03 secs] 
2020-06-04T21:25:05.813+0800: 534330.815: [GC (Allocation Failure) [PSYoungGen: 168816K->4272K(169472K)] 316092K->151748K(519168K), 0.0277507 secs] [Times: user=0.05 sys=0.00, real=0.03 secs] 
2020-06-04T23:16:54.931+0800: 541039.934: [GC (Allocation Failure) [PSYoungGen: 168624K->4400K(169472K)] 316100K->152076K(519168K), 0.0446292 secs] [Times: user=0.05 sys=0.00, real=0.04 secs] 
2020-06-05T01:06:42.404+0800: 547627.407: [GC (Allocation Failure) [PSYoungGen: 168752K->4400K(169472K)] 316428K->152269K(519168K), 0.0287471 secs] [Times: user=0.05 sys=0.00, real=0.03 secs] 
2020-06-05T02:59:15.867+0800: 554380.869: [GC (Allocation Failure) [PSYoungGen: 168752K->4224K(169472K)] 316621K->152277K(519168K), 0.0340430 secs] [Times: user=0.04 sys=0.00, real=0.04 secs] 
2020-06-05T04:50:32.043+0800: 561057.046: [GC (Allocation Failure) [PSYoungGen: 168576K->4432K(169472K)] 316629K->152677K(519168K), 0.0430916 secs] [Times: user=0.05 sys=0.00, real=0.04 secs] 
2020-06-05T06:41:54.359+0800: 567739.362: [GC (Allocation Failure) [PSYoungGen: 168784K->4384K(169472K)] 317029K->152813K(519168K), 0.0290736 secs] [Times: user=0.05 sys=0.00, real=0.03 secs] 
2020-06-05T08:33:14.539+0800: 574419.542: [GC (Allocation Failure) [PSYoungGen: 168736K->4448K(169984K)] 317165K->153061K(519680K), 0.0297331 secs] [Times: user=0.05 sys=0.00, real=0.03 secs] 
2020-06-05T10:26:46.837+0800: 581231.840: [GC (Allocation Failure) [PSYoungGen: 169824K->4320K(169984K)] 318437K->153157K(519680K), 0.0296891 secs] [Times: user=0.04 sys=0.00, real=0.03 secs] 
2020-06-05T12:18:59.226+0800: 587964.229: [GC (Allocation Failure) [PSYoungGen: 169696K->4368K(169984K)] 318533K->153398K(519680K), 0.0283164 secs] [Times: user=0.04 sys=0.00, real=0.03 secs] 
2020-06-05T13:41:43.696+0800: 592928.699: [GC (Heap Inspection Initiated GC) [PSYoungGen: 129280K->3488K(168960K)] 278310K->152718K(518656K), 0.0232744 secs] [Times: user=0.04 sys=0.00, real=0.03 secs] 
2020-06-05T13:41:43.720+0800: 592928.723: [Full GC (Heap Inspection Initiated GC) [PSYoungGen: 3488K->0K(168960K)] [ParOldGen: 149229K->100552K(349696K)] 152718K->100552K(518656K), [Metaspace: 89244K->88754K(1130496K)], 0.5901316 secs] [Times: user=2.42 sys=0.00, real=0.59 secs] 

2020-06-05T13:42:09.798+0800: 592954.801: [GC (Heap Inspection Initiated GC) [PSYoungGen: 3117K->544K(168448K)] 103669K->101096K(518144K), 0.0102608 secs] [Times: user=0.03 sys=0.00, real=0.01 secs] 

2020-06-05T13:42:09.808+0800: 592954.811: [Full GC (Heap Inspection Initiated GC) [PSYoungGen: 544K->0K(168448K)] [ParOldGen: 100552K->82313K(349696K)] 101096K->82313K(518144K), [Metaspace: 88754K->88754K(1130496K)], 0.2377425 secs] [Times: user=0.85 sys=0.00, real=0.23 secs] 

2020-06-05T15:17:35.107+0800: 598680.110: [GC (Allocation Failure) [PSYoungGen: 163328K->4304K(168960K)] 245641K->86625K(518656K), 0.0396373 secs] [Times: user=0.05 sys=0.00, real=0.04 secs] 

注意:

  • GC (Allocation Failure) : 發生了一次垃圾回收,若前面有Full則表明是Full GC,沒有Full的修飾表明這是一次Minor GC 。括號裏的內容是gc發生的原因,這裏的Allocation Failure的原因是年輕代中沒有足夠區域能夠存放需要分配的數據而失敗。

java業務日誌(請求數,耗時,成功率,失敗率)

  • 根據業務流程去排查即可。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章