JVM堆内存分配

一张图展示 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 = 2OldSize + NewSize = 169.5 + 84.5 = 256,这个约为物理内存的1/64,也就是-Xms的大小。