JVM堆内存分配
25 Jun 2021 | Java |一张图展示 JVM
内存分配
记录下几个主要的参数设置:
-Xmx
:堆内存最大值,默认为物理内存的1/4
。-Xmx
和-XX:MaxHeapSize
是等价的。-Xms
:堆内存初始值,默认为物理内存的1/64
,这里包括初始化和最小值的设置,如果想分别设置,可以通过参数-XX:InitialHeapSize
设置堆内存的初始值;可以通过参数-XX:MinHeapSize
设置堆内存的最小值。-Xmn
:设置年轻代(或者叫Young
区)的大小,这里包括初始化和最大值的设置,如果想分别设置,可以通过参数-XX:NewSize
设置Young
区的初始值;可以通过参数-XX:MaxNewSize
设置Young
区的最大值。
一般建议将-Xmx
和-Xms
设置成相同的值,以避免因内存分配造成的耗时。
运行一个简单的Spring Boot
程序,不设置任何参数,通过命令 jps
查看Java
进程,再通过命令jmap -heap pid
,查看当前应用堆内存分配状态信息。
> jmap -heap 16488
Attaching to process ID 16488, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.251-b08
using thread-local object allocation.
Parallel GC with 8 thread(s) // 并行GC
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 4250927104 (4054.0MB) // 最大堆内存
NewSize = 88604672 (84.5MB) // Young区初始值
MaxNewSize = 1416626176 (1351.0MB) // Young区最大值
OldSize = 177733632 (169.5MB) // Old区
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation // Young区使用情况
Eden Space:
capacity = 159907840 (152.5MB)
used = 39639584 (37.803253173828125MB)
free = 120268256 (114.69674682617188MB)
24.789018474641395% used
From Space:
capacity = 12582912 (12.0MB)
used = 0 (0.0MB)
free = 12582912 (12.0MB)
0.0% used
To Space:
capacity = 12058624 (11.5MB)
used = 0 (0.0MB)
free = 12058624 (11.5MB)
0.0% used
PS Old Generation // Old区使用情况
capacity = 155189248 (148.0MB)
used = 12011296 (11.454864501953125MB)
free = 143177952 (136.54513549804688MB)
7.73977331213049% used
13830 interned Strings occupying 1314552 bytes.
从上图,可以看出 OldSize / NewSize = 169.5 / 84.5 = 2
; OldSize + NewSize = 169.5 + 84.5 = 256
,这个约为物理内存的1/64
,也就是-Xms
的大小。