一、jstat命令
jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下:
jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]
1、查看class加载统计
说明:
●Loaded:加载class的数量
●Bytes: 所占用空间大小
●Unloaded: 未加载数量
●Bytes: 未加载占用空间
●Time:时间
2、查看编译统计
说明:
●Compiled: 编译数量。
●Failed: 失败数量
●Invalid: 不可用数量
●Time: 时间
●FailedType: 失败类型
●FailedMethod: 失败的方法
3、垃圾回收统计
第二句为每1秒中打印一次,共打印5次
说明:
●SOC:第一个Survivor区的大小(KB)
●S1C: 第二个Survivor区的大小(KB )
●SOU:第一个Survivor区的使用大小(KB)
●S1U: 第二个Survivor区的使用大小(KB)
●EC: Eden区的大小(KB)
●EU: Eden区的使用大小(KB)
●OC: Old区大小(KB)
●OU: Old使用大小(KB)
●MC:方法区大小(KB)
●MU:方法区使用大小(KB)
●CCSC: 压缩类空间大小(KB)
●CCSU: 压缩类空间使用大小(KB)
●YGC:年轻代垃圾回收次数
●YGCT: 年轻代垃圾回收消耗时间
●FGC:老年代垃圾回收次数
●FGCT: 老年代垃圾回收消耗时间
●GCT: 垃圾回收消耗总时间
jmap的使用以及内存溢出分析
前面通过jstat可以对jvm堆的内存进行统计分析,而jmap可以获取到更加详细的内容, 如:内存使用情况的汇总、对内存溢出的定位与分析。
1、查看内存使用情况
D:\>jmap -heap 4668
Attaching to process ID 4668, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.91-b15
using thread-local object allocation.
Parallel GC with 10 thread(s)
Heap Configuration: #堆内存配置信息
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 4284481536 (4086.0MB)
NewSize = 89128960 (85.0MB)
MaxNewSize = 1428160512 (1362.0MB)
OldSize = 179306496 (171.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage: # 堆内存使用情况
PS Young Generation #年轻代
Eden Space:
capacity = 297795584 (284.0MB)
used = 155793680 (148.57643127441406MB)
free = 142001904 (135.42356872558594MB)
52.31564481493453% used
From Space:
capacity = 19398656 (18.5MB)
used = 18135736 (17.29558563232422MB)
free = 1262920 (1.2044143676757812MB)
93.4896520666174% used
To Space:
capacity = 22020096 (21.0MB)
used = 0 (0.0MB)
free = 22020096 (21.0MB)
0.0% used
PS Old Generation #老年代
capacity = 143130624 (136.5MB)
used = 24800264 (23.65137481689453MB)
free = 118330360 (112.84862518310547MB)
17.32701451787145% used
28233 interned Strings occupying 3284720 bytes.
2、查看内存中对象数量及大小
#查看所有对象,包括活跃以及非活跃的
D:\>jmap -histo 4668 | more
#查看活跃对象
D:\>jmap -histo:live 4668 | more
num #instances #bytes class name
----------------------------------------------
1: 84202 10766696 [C
2: 35807 3151016 java.lang.reflect.Method
3: 82922 1990128 java.lang.String
4: 42654 1364928 java.util.concurrent.ConcurrentHashMap$Node
5: 31817 1272680 java.util.LinkedHashMap$Entry
6: 11076 1233768 java.lang.Class
7: 12272 963800 [Ljava.util.HashMap$Node;
8: 16225 920776 [Ljava.lang.Object;
9: 6790 809560 [B
10: 23813 762016 java.util.HashMap$Node
11: 32910 741320 [Ljava.lang.Class;
12: 12351 691656 java.util.LinkedHashMap
13: 5231 513816 [I
14: 6982 502704 java.lang.reflect.Field
15: 239 417088 [Ljava.util.concurrent.ConcurrentHashMap$Node;
16: 16478 395472 org.springframework.core.MethodClassKey
17: 11319 271656 java.util.ArrayList
18: 16037 256592 java.lang.Object
19: 3135 250800 java.lang.reflect.Constructor
20: 4123 197904 java.util.HashMap
21: 2774 176744 [Ljava.lang.reflect.Method;
22: 2242 161424 org.springframework.core.annotation.AnnotationAttributes
23: 3948 154472 [Ljava.lang.String;
24: 2601 145656 java.lang.Class$ReflectionData
25: 3422 136880 java.lang.ref.SoftReference
26: 2899 92768 java.util.LinkedList
27: 3814 91536 java.util.LinkedList$Node
28: 1781 85488 org.springframework.core.ResolvableType
29: 1914 76560 java.util.TreeMap$Entry
30: 1911 76440 com.sun.org.apache.xerces.internal.dom.DeferredTextImpl
31: 3007 72168 sun.reflect.annotation.AnnotationInvocationHandler
32: 1236 69216 java.lang.invoke.MemberName
33: 4194 67104 org.springframework.core.annotation.AnnotationUtils$DefaultValueHolder
34: 4110 65760 java.util.LinkedHashSet
35: 1571 62840 com.sun.org.apache.xerces.internal.dom.DeferredAttrImpl
36: 1007 56392 com.sun.org.apache.xerces.internal.dom.DeferredElementImpl
37: 2334 56016 sun.reflect.generics.tree.SimpleClassTypeSignature
38: 3353 53648 java.util.LinkedHashMap$LinkedEntrySet
39: 319 53592 org.springframework.beans.factory.support.RootBeanDefinition
40: 1253 50120 com.fasterxml.jackson.databind.introspect.AnnotatedMethod
41: 1548 49536 java.util.Hashtable$Entry
42: 1022 49056 org.apache.tomcat.util.modeler.AttributeInfo
43: 1127 45080 java.lang.invoke.MethodType
44: 529 43864 [Lorg.springframework.boot.context.properties.source.ConfigurationPropertyName$ElementType;
45: 2334 43768 [Lsun.reflect.generics.tree.TypeArgument;
46: 606 43632 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$ShortcutDependencyDescriptor
47: 1363 43616 java.lang.ref.WeakReference
48: 1831 42392 [Ljava.lang.reflect.Constructor;
49: 236 41536 org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader$ConfigurationClassBeanDefinition
50: 504 40320 springfox.documentation.schema.ModelProperty
51: 619 39616 java.util.concurrent.ConcurrentHashMap
52: 706 39536 java.lang.Package
53: 856 38920 [Ljava.lang.reflect.Field;
54: 1210 38720 java.util.concurrent.locks.ReentrantLock$NonfairSync
55: 1556 37344 org.springframework.cglib.core.Signature
56: 1160 37120 java.lang.invoke.MethodType$ConcurrentWeakInternSet$WeakEntry
57: 2276 36416 sun.reflect.generics.tree.ClassTypeSignature
58: 753 36144 ch.qos.logback.classic.Logger
59: 2226 35616 java.util.LinkedHashMap$LinkedKeySet
60: 1435 34440 java.lang.Class$AnnotationData
61: 133 33672 [[C
62: 1395 33480 java.util.jar.Attributes$Name
63: 1398 32728 [Ljava.lang.reflect.Type;
64: 1008 32256 com.fasterxml.jackson.databind.introspect.POJOPropertyBuilder$Linked
65: 1003 32096 java.lang.ref.ReferenceQueue
66: 318 31832 [Ljava.util.Hashtable$Entry;
67: 217 30608 [Z
68: 672 30392 [Lorg.springframework.util.ConcurrentReferenceHashMap$Reference;
69: 1249 29976 java.util.Collections$UnmodifiableRandomAccessList
-- More --
#对象说明
B byte
C char
D double
F float
I int
J long
Z boolean
[ 数组,如[I表示int[]
[L+类名其他对象
将内存使用情况dump到文件中
有些时候我们需要将jvm当前内存中的情况dump到文件中,然后对它进行分析,jmap也是支持dump到文件中的。
#用法:
jmap - dump :format=b,f ile=dumpF ileName <pid>
#示例
D:\>jmap -dump:format=b,file=dump.dat 4668
Dumping heap to D:\dump.dat ...
Heap dump file created
通过jhat对dump文件进行分析
#用法
jhat -port <port> <file>
#实例
D:\>jhat -port 8888 D:\dump.dat
Reading from D:\dump.dat...
Dump file created Sat Mar 14 20:20:22 CST 2020
Snapshot read, resolving...
Resolving 663602 objects...
Chasing references, expect 132 dots....................................................................................................................................
Eliminating duplicate references....................................................................................................................................
Snapshot resolved.
Started HTTP server on port 8888
Server is ready.
#然后就可以通过浏览器进行访问:http://localhost:8888/
访问规则就是你开启的服务端的ip加端口
最后有OQL查询功能
通过MAT工具对dump文件进行分析
MAT工具介绍
MAT(Memory Analyzer Tool), -个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象。
官网地址: https://www.eclipse.org/mat/
使用详情见 https://blog.csdn.net/lixld/article/details/80212193
jstack的使用
有些时候我们需要查看下jvm中的线程执行情况,比如,发现服务器的CPU的负载突然增高了、出现了死锁、死循环等,我们该如何分析呢?由于程序是正常运行的,没有任何的输出,从日志方面也看不出什么问题,所以就需要看下jvm的内部线程的执行情况,然后再进行分析查找出原因。这个时候,就需要借助于jstack命令了,jstack的作用是将正在运行的jvm的线程情况进行快照,并且打印出来:
#用法:jstack <pid>
jstack 4668
VisualVM工具的使用
VisualVM,能够监控线程,内存情况,查看方法的CPU时间和内存中的对象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。VisualVM使用简单,几乎0配置,功能还是比较丰富的,几乎囊括了其它JDK自带命令的所有功能。
●内存信息
●线程信息
●Dump堆(本地进程)
●Dump线程(本地进程)
●打开堆Dump。 堆Dump可以用jmap来生成。
●打开线程Dump
●生成应用快照(包含内存信息、线程信息等等)
●性能分析。CPU分析(各个方法调用时间,检查哪些方法耗时多),内存分析(各类对象占用的内存,检查哪些类占用内存多)
启动
在jdk安装目录下进入bin目录找到jvisualvm.exe 打开即可