【JAVA】线上排查

1.首先说几个概念:

PID:进程的身份证号

TOP命令:查询进程占用内存排名

PS命令:进程监控命令,查看进程以及进程中线程使用情况,属于当前状态采样数据

2.Linux下查看tomcat日志

⑴先切换到:cd usr/local/tomcat5/logs
⑵tail -f catalina.out
⑶这样运行时就可以实时查看运行日志了

3.JPS命令

显示当前所有java进程pid的命令。 

4.jinfo命令

JAVA8已经不支持

5.jstack命令

jstack可以告诉你当前所有JVM线程正在做什么,包括用户线程和虚拟机线程,你可以用它来查看线程栈,并且结合Lock信息来检测是否发生了死锁和死锁的线程。

6.jstat命令
jstat(JVM Statistics Monitoring Tool) 是用于监控JVM各种运行状态信息的命令行工具。

⑴查看进程的GC情况

jstat -gc 30996 3000
即:每3秒一次显示进程号为30996的java进程的GC情况
或使用命令:jstat -gcutil 30996 3000

 

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总耗时<br><br>

 

S0C:年轻代中第一个survivor(幸存区)的容量 (字节) 

S1C:年轻代中第二个survivor(幸存区)的容量 (字节) 

E:年轻代中Eden(伊甸园)已使用的占当前容量百分比 

O:old代已使用的占当前容量百分比 

P:perm代已使用的占当前容量百分比 

YGC:从应用程序启动到采样时年轻代中gc次数 

YGCT:从应用程序启动到采样时年轻代中gc所用时间(s) 

FGC:从应用程序启动到采样时old代(全gc)gc次数 

FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s) 

GCT:从应用程序启动到采样时gc用的总时间(s)

举个采样的例子:

 

jstat -gcutil 21891 250 7

S0       S1     E      O      P     YGC  YGCT FGC FGCT GCT

 

12.44 0.00 27.20 9.49 96.70 78     0.176     5    0.495 0.672
12.44 0.00 62.16 9.49 96.70 78     0.176     5    0.495 0.672
12.44 0.00 83.97 9.49 96.70 78     0.176     5    0.495 0.672
0.00   7.74 0.00   9.51 96.70 79     0.177     5    0.495 0.673
0.00   7.74 23.37 9.51 96.70 79     0.177     5    0.495 0.673
0.00   7.74 43.82 9.51 96.70 79     0.177     5    0.495 0.673
0.00   7.74 58.11 9.51 96.71 79     0.177     5    0.495 0.673
以上输出表明:
① 在第三行与第四行,发生一次新生代gc。 本次gc耗时0.001秒,且有对象从Eden区提升到老生代,老生代使用率从9.49% 上升到9.51%。
② gc之前,survivor space 使用率12.44%, gc后,降为7.74%。
7.jmap命令

排查GC问题必然会用到的工具,jmap可以告诉你当前JVM内存堆中的对象分布及其关系,当你dump堆之后可以用MAT分析,看看有哪些大对象,或者哪些类的实例特别多。

jmap主要是三个命令比较重要:

 

-dump : 生成Java堆转储快照
-heap:显示Java堆详细信息
-histo:显示堆中对象统计信息

⑴dump
JVM Memory Map命令用于生成heap dump文件,如果不使用这个命令,还可以使用-XX:+HeapDumpOnOutOfMemoryError参数来让虚拟机出现OOM的时候自动生成dump文件。 jmap不仅能生成dump文件,还可以查询finalize执行队列、Java堆和永久代的详细信息,如当前使用率、当前使用的是哪种收集器等。【内存分析】

 

通过jmap和MAT排查内存泄漏:

jmap-dump:format=b,file=heap.bin 8120

将8120进程内存heap输出到heap.bin文件里,将heap.bin导入mat中。

查看对象数目和占用内存大小:

jmap -histo:live [pid]

点击打开链接

⑵heap

jmap -heap 31846:

 

Attaching to process ID 31846, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.71-b01
 
using thread-local object allocation.
Parallel GC with 4 thread(s)//GC 方式
 
Heap Configuration: //堆内存初始化配置
   MinHeapFreeRatio = 0 //对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)
   MaxHeapFreeRatio = 100 //对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)
   MaxHeapSize      = 2082471936 (1986.0MB) //对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
   NewSize          = 1310720 (1.25MB)//对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小
   MaxNewSize       = 17592186044415 MB//对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
   OldSize          = 5439488 (5.1875MB)//对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的‘老生代’的大小
   NewRatio         = 2 //对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
   SurvivorRatio    = 8 //对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值 
   PermSize         = 21757952 (20.75MB)  //对应jvm启动参数-XX:PermSize=<value>:设置JVM堆的‘永生代’的初始大小
   MaxPermSize      = 85983232 (82.0MB)//对应jvm启动参数-XX:MaxPermSize=<value>:设置JVM堆的‘永生代’的最大大小
   G1HeapRegionSize = 0 (0.0MB)
 
Heap Usage://堆内存使用情况
PS Young Generation
Eden Space://Eden区内存分布
   capacity = 33030144 (31.5MB)//Eden区总容量
   used     = 1524040 (1.4534378051757812MB)  //Eden区已使用
   free     = 31506104 (30.04656219482422MB)  //Eden区剩余容量
   4.614088270399305% used //Eden区使用比率
From Space:  //其中一个Survivor区的内存分布
   capacity = 5242880 (5.0MB)
   used     = 0 (0.0MB)
   free     = 5242880 (5.0MB)
   0.0% used
To Space:  //另一个Survivor区的内存分布
   capacity = 5242880 (5.0MB)
   used     = 0 (0.0MB)
   free     = 5242880 (5.0MB)
   0.0% used
PS Old Generation //当前的Old区内存分布
   capacity = 86507520 (82.5MB)
   used     = 0 (0.0MB)
   free     = 86507520 (82.5MB)
   0.0% used
PS Perm Generation//当前的 “永生代” 内存分布
   capacity = 22020096 (21.0MB)
   used     = 2496528 (2.3808746337890625MB)
   free     = 19523568 (18.619125366210938MB)
   11.337498256138392% used
 
670 interned Strings occupying 43720 bytes.

⑶histo

 

如果live子参数加上后,只统计活的对象数量

 

[C is a char[]
[S is a short[]
[I is a int[]
[B is a byte[]
[[I is a int[][]

举例:

 

jmap -histo pid 输出结果样式:

 num     #instances         #bytes  class name
----------------------------------------------
   1:       1169837      131659368  [C
   2:         25945       38337824  [I
   3:         31548       29407968  [B
   4:       1164546       27949104  java.lang.String
   6:         91313       12829072  <constMethodKlass>
   7:         12395       12404880  [S
   8:         91313       11700288  <methodKlass>
   9:          7525        9303112  <constantPoolKlass>
  10:          7525        5606808  <instanceKlassKlass>
  11:          6043        5028288  <constantPoolCacheKlass>
  12:         10048        2007888  [Ljava.lang.Object;
  14:          3507        1707048  <methodDataKlass>
  15:          8132         980616  java.lang.Class
  16:         26854         859328  java.util.HashMap$Entry
  17:         12368         699296  [[I
  18:         14135         452320  java.util.concurrent.ConcurrentHashMap$HashEntry
  19:         20883         334128  java.lang.Object
  20:           590         316240  <objArrayKlassKlass>
  21:          1757         305904  [Ljava.util.HashMap$Entry;
  22:          2809         224720  net.sf.ehcache.Element
  23:          1992         223104  java.net.SocksSocketImpl
  24:          2668         213440  java.lang.reflect.Method
  26:          5932         183928  [Ljava.lang.String;
  27:          7588         182112  java.util.concurrent.ConcurrentSkipListMap$Node
  28:          7317         175608  java.lang.Long
  29:          5303         169696  java.util.Hashtable$Entry
  30:          6778         162672  java.util.ArrayList
  31:          3931         157240  java.lang.ref.SoftReference
  32:          2972         118880  java.util.LinkedHashMap$Entry
  33:          1565         112680  org.apache.commons.pool2.impl.DefaultPooledObject
  34:          2817         112680  net.sf.ehcache.store.chm.SelectableConcurrentHashMap$HashEntry
  35:          2243         107664  java.util.HashMap
  36:          2592         103680  java.util.TreeMap$Entry
  37:          3214         102848  java.lang.ref.WeakReference
  38:          1565         100160  redis.clients.jedis.Client
  39:          4155          99720  java.util.LinkedList$Node
  40:          1986          95328  java.net.SocketInputStream
  41:           414          92952  [Ljava.util.concurrent.ConcurrentHashMap$HashEntry;
  42:          2275          91000  java.lang.ref.Finalizer
  43:          1161          83592  java.lang.reflect.Constructor
  44:           757          78728  java.io.ObjectStreamClass
  45:          1587          76176  java.net.SocketOutputStream
  46:          1189          66584  java.beans.MethodDescriptor
  47:          2770          66480  org.apache.commons.pool2.impl.LinkedBlockingDeque$Node
  48:           388          66368  [Ljava.util.Hashtable$Entry;
  49:          1989          63648  java.net.Socket
  50:           749          53928  java.lang.reflect.Field
  ...
  ...
2947:             1             16  sun.misc.Launcher
2948:             1             16  org.codehaus.jackson.map.ser.std.DateSerializer
2949:             1             16  org.apache.phoenix.schema.types.PDataType$2
2950:             1             16  org.springframework.data.redis.connection.convert.StringToRedisClientInfoConverter
Total       3090439      316004152

 

 

 

 

 

 

 

 


 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值