一、背景
有题目中的需求,也不是空穴来风;前一阵给公司搭建了一个持续集成服务器,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根据机器的物理内存大小,自动计算的。