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总耗时
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=:设置JVM堆的‘老生代’的大小
NewRatio = 2 //对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
SurvivorRatio = 8 //对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值
PermSize = 21757952 (20.75MB) //对应jvm启动参数-XX:PermSize=:设置JVM堆的‘永生代’的初始大小
MaxPermSize = 85983232 (82.0MB)//对应jvm启动参数-XX:MaxPermSize=:设置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
7: 12395 12404880 [S
8: 91313 11700288
9: 7525 9303112
10: 7525 5606808
11: 6043 5028288
12: 10048 2007888 [Ljava.lang.Object;
14: 3507 1707048
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
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