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业务日志(请求数,耗时,成功率,失败率)

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