jmap命令
jmap命令是一个可以输出所有内存中对象的工具,甚至可以将VM中的heap,以二进制输出文本。
打印出某个java进程(使用pid)内存内的,所有’对象’的情况(如:产生哪些对象,及其数量)
采用springboot来试验
步骤1:打包springboot
步骤2:上传到linux,然后执行java -jar -Xms512m -Xmx512m app.jar
打开另外一个窗口
[root@iZ8vb4nxo286g9whbamf57Z app]# jmap -heap 23894
Attaching to process ID 23894, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.131-b11
using thread-local object allocation.
Mark Sweep Compact GC #采用标记-清除-压缩的GC算法
Heap Configuration:
MinHeapFreeRatio = 40 #JVM最小空闲比率 可由-XX:MinHeapFreeRatio=<n>参数设置, jvm heap 在使用率小于 n 时 ,heap 进行收缩
MaxHeapFreeRatio = 70 #JVM最大空闲比率 可由-XX:MaxHeapFreeRatio=<n>参数设置, jvm heap 在使用率大于 n 时 ,heap 进行扩张
MaxHeapSize = 536870912 (512.0MB) #JVM堆的最大大小 可由-XX:MaxHeapSize=<n>参数设置
NewSize = 178913280 (170.625MB) #JVM新生代的默认大小 可由-XX:NewSize=<n>参数设置
MaxNewSize = 178913280 (170.625MB) #JVM新生代的最大大小 可由-XX:MaxNewSize=<n>参数设置
OldSize = 357957632 (341.375MB) #JVM老生代的默认大小 可由-XX:OldSize=<n>参数设置
NewRatio = 2 #新生代:老生代(的大小)=1:2
可由-XX:NewRatio=<n>参数指定New Generation与Old Generation heap size的比例
SurvivorRatio = 8 #survivor:eden = 1:8,即survivor space是新生代大小的1/(8+2)
[因为有两个survivor区域] 可由-XX:SurvivorRatio=<n>参数设置
MetaspaceSize = 21807104 (20.796875MB) #元空间的默认大小,超过此值就会触发Full GC 可由-XX:MetaspaceSize=<n>参数设置
CompressedClassSpaceSize = 1073741824 (1024.0MB) #类指针压缩空间的默认大小 可由-XX:CompressedClassSpaceSize=<n>参数设置
MaxMetaspaceSize = 17592186044415 MB #元空间的最大大小 可由-XX:MaxMetaspaceSize=<n>参数设置
G1HeapRegionSize = 0 (0.0MB) #使用G1垃圾收集器的时候,堆被分割的大小 可由-XX:G1HeapRegionSize=<n>参数设置
Heap Usage:
New Generation (Eden + 1 Survivor Space): #新生代区内存分布,包含eden区 和 Survivor区
capacity = 161021952 (153.5625MB)
used = 72713528 (69.34502410888672MB)
free = 88308424 (84.21747589111328MB)
45.15752485723189% used
Eden Space: #Eden区内存
capacity = 143130624 (136.5MB)
used = 65191968 (62.171905517578125MB)
free = 77938656 (74.32809448242188MB)
45.54718352936126% used
From Space: #Survivor区的from内存
capacity = 17891328 (17.0625MB)
used = 7521560 (7.173118591308594MB)
free = 10369768 (9.889381408691406MB)
42.04025548019688% used
To Space: #Survivor区的to内存
capacity = 17891328 (17.0625MB)
used = 0 (0.0MB)
free = 17891328 (17.0625MB)
0.0% used
tenured generation: #老生代区内存分布
capacity = 357957632 (341.375MB)
used = 6921632 (6.600982666015625MB)
free = 351036000 (334.7740173339844MB)
1.9336455997116442% used
11898 interned Strings occupying 1024104 bytes.
总结
java的堆是按照 垃圾收集器设计的。目前主流的垃圾收集器G1
芬待设计的垃圾收集器主要是CMS,G1。
堆的分代设计,就是把一块内存划分为多块。
堆的内存空间分配主要分为2块,年轻代和老年代。
年轻代和老年代的比例是1:2,可采用-XX:NewRatio=
年轻代分为Eden和Survivor From、Survivor To的大小比例是8:1:1,可采用-XX:SurvivorRatio=