2019独角兽企业重金招聘Python工程师标准>>>
最近一个项目总发出堆内存过大报警,dump出了内存也一直没时间研究,今天正好整理下相关用到的命令和代码
这里有几个主要的命令和工具
jinfo:可以输出并修改运行时的java 进程的opts。
jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。
jstat:一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。
jmap:打印出某个java进程(使用pid)内存内的所有'对象'的情况(如:产生那些对象,及其数量)。
jconsole:一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。
这里就来一一使用一下:
1 JPS命令
C:\Users\Administrator>jps
3148 Bootstrap
8920 Jps
6264
JPS可以查到3148是我当前服务器启动的进程号
2 JSTAT命令
C:\Users\Administrator>jstat -class 3148
Loaded Bytes Unloaded Bytes Time
8988 10830.6 0 0.0 9.20
这个命令可以用来查看加载class的数量级占用的空间
C:\Users\Administrator>jstat -compiler 3148
Compiled Failed Invalid Time FailedType FailedMethod
2930 3 0 1.56 1 org/springframework/beans/factory/support/DefaultListableBeanFactory getBeanNamesForType
这个命令可以用来产看jvn编译的数量信息
C:\Users\Administrator>jstat -gc 3148
S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT
3968.0 3968.0 2388.4 0.0 31936.0 333.3 79588.0 49166.1 38144.0 38125.1 82 0.489 7 0.620 1.109
这个命令可以用来查看GC的信息和GC的次数
C:\Users\Administrator>jstat -gccapacity 3148
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC PGCMN PGCMX PGC PC YGC FGC
5440.0 87360.0 39872.0 3968.0 3968.0 31936.0 10944.0 174784.0 79588.0 79588.0 12288.0 65536.0 38144.0 38144.0 82 7
这个命令可以用来产看young,old和perm区的对象和使用大小
C:\Users\Administrator>jstat -printcompilation 3148
Compiled Size Type Method
2949 188 1 java/util/concurrent/ConcurrentLinkedQueue poll
这个命令可以用来查看当前VM执行信息
3 jinfo 可以用来查看和更改java进程运行的参数
4 jmap命令可以输出所有内存中的对象
C:\Users\Administrator>jmap -histo:live 3148
C:\Users\Administrator>jmap -heap 3148
Attaching to process ID 3148, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 23.7-b01
using thread-local object allocation.
Mark Sweep Compact GC
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 268435456 (256.0MB)
NewSize = 1048576 (1.0MB)
MaxNewSize = 4294901760 (4095.9375MB)
OldSize = 4194304 (4.0MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 12582912 (12.0MB)
MaxPermSize = 67108864 (64.0MB)
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
New Generation (Eden + 1 Survivor Space):
capacity = 36700160 (35.0MB)
used = 4734920 (4.515571594238281MB)
free = 31965240 (30.48442840576172MB)
12.901633126395089% used
Eden Space:
capacity = 32636928 (31.125MB)
used = 4734920 (4.515571594238281MB)
free = 27902008 (26.60942840576172MB)
14.50786054373745% used
From Space:
capacity = 4063232 (3.875MB)
used = 0 (0.0MB)
free = 4063232 (3.875MB)
0.0% used
To Space:
capacity = 4063232 (3.875MB)
used = 0 (0.0MB)
free = 4063232 (3.875MB)
0.0% used
tenured generation:
capacity = 81498112 (77.72265625MB)
used = 30978160 (29.543075561523438MB)
free = 50519952 (48.17958068847656MB)
38.0108928167563% used
Perm Generation:
capacity = 39059456 (37.25MB)
used = 38951352 (37.14690399169922MB)
free = 108104 (0.10309600830078125MB)
99.72323219248112% used
22804 interned Strings occupying 2668488 bytes.
这个命令可以用来查看堆的使用状况信息
C:\Users\Administrator>jmap -dump:format=b,file=heap1.bin 3148
Dumping heap to C:\Users\Administrator\heap1.bin ...
Heap dump file created
这个命令用来保存内存中的对象到指定的文件中
5 jconsole工具
输入jconsole后可以出现jconsole的界面
其中内存分区如下说明,
Eden Space (heap): 内存最初从这个线程池分配给大部分对象。
Survivor Space (heap):用于保存在eden space内存池中经过垃圾回收后没有被回收的对象。
Tenured Generation (heap):用于保持已经在 survivor space内存池中存在了一段时间的对象。
Permanent Generation (non-heap): 保存虚拟机自己的静态(refective)数据,例如类(class)和方法(method)对象。Java虚拟机共享这些类数据。这个区域被分割为只读的和只写的,
Code Cache (non-heap):HotSpot Java虚拟机包括一个用于编译和保存本地代码(native code)的内存,叫做“代码缓存区”(code cache)
6 jstack命令
C:\Users\Administrator>jstack 3148
这个命令用来查看进程下jvm的运行状态
参考文档:http://boendev.iteye.com/blog/882479
总结一下,这里没有具体的线上的实现例子,等遇到线上问题的时候可以结合jmap分析下线上的具体问题,另外还有个MemoryAnalyzer可用来查看dump文件。这个明晚好好研究一下