一、背景
有题目中的需求,也不是空穴来风;前一阵给公司搭建了一个持续集成服务器,Jenkins。最近发现,运行一段时间后,就变慢了。
随便一个操作,cpu就飙高了。然后就思考会不会是内存不够用,频繁GC导致的呢?
Jenkins是个war包,我直接放在tomcat运行的。所以,我需要查看下,当前运行的这个tomcat的堆大小。
二、步骤
[root@pas jenkins-apache-tomcat-8.5.28]# jmap -heap 90170
Attaching to process ID 90170, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.161-b12 using thread-local object allocation.
Parallel GC with 8 thread(s) Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 4160749568 (3968.0MB) -----------堆的最大容量
NewSize = 86507520 (82.5MB)
MaxNewSize = 1386741760 (1322.5MB)
OldSize = 173539328 (165.5MB)
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 = 1306001408 (1245.5MB)
used = 1123777200 (1071.7174530029297MB)
free = 182224208 (173.7825469970703MB)
86.04716603797107% used
From Space:
capacity = 37748736 (36.0MB)
used = 17255448 (16.456077575683594MB)
free = 20493288 (19.543922424316406MB)
45.711326599121094% used
To Space:
capacity = 37224448 (35.5MB)
used = 0 (0.0MB)
free = 37224448 (35.5MB)
0.0% used
PS Old Generation
capacity = 212336640 (202.5MB)
used = 90248224 (86.06741333007812MB)
free = 122088416 (116.43258666992188MB)
42.50242633584105% used 44622 interned Strings occupying 4789016 bytes.
具体的字段意思,我查阅了oracle的官方资料,如下,但也没有看到具体解释,只能慢慢探索了:
https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr014.html#BABJIIIH
可以看到,上面的tomcat的最大堆容量还是很大的,当然,我们自己没有配置过,应该是JVM根据机器的物理内存大小,自动计算的。