内容来源:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/parallel.html#default_heap_size
默认堆大小
除非在命令行中指定了初始和最大堆大小,否则它们是根据机器上的内存量计算的。
客户端 JVM 默认初始和最大堆大小
默认的最大堆大小是物理内存的一半,最大为 192 兆字节 (MB) 的物理内存大小,否则为物理内存的四分之一,最大为 1 吉字节 (GB) 的物理内存大小。
例如,如果您的计算机有 128 MB 的物理内存,则最大堆大小为 64 MB,大于或等于 1 GB 的物理内存导致最大堆大小为 256 MB。
JVM 不会实际使用最大堆大小,除非您的程序创建了足够多的对象来要求它。在 JVM 初始化期间分配的数量要小得多,称为初始堆大小。此数量至少为 8 MB,否则为物理内存的 1/64,最大为 1 GB 的物理内存大小。
分配给年轻代的最大空间量是总堆大小的三分之一。
服务器 JVM 默认初始和最大堆大小
默认初始和最大堆大小在服务器 JVM 上的工作方式与在客户端 JVM 上的工作方式类似,只是默认值可以更高。在 32 位 JVM 上,如果有 4 GB 或更多的物理内存,则默认的最大堆大小可以高达 1 GB。在 64 位 JVM 上,如果有 128 GB 或更多的物理内存,则默认的最大堆大小可以高达 32 GB。你总是可以通过直接指定这些值来设置更高或更低的初始和最大堆;请参阅下一节。
指定初始和最大堆大小
您可以使用标志**-Xms(初始堆大小)和-Xmx(最大堆大小)指定初始和最大堆大小**。如果您知道您的应用程序需要多少堆才能正常工作,您可以将-Xms和设置-Xmx为相同的值。如果不是,JVM 将首先使用初始堆大小,然后增大 Java 堆,直到找到堆使用和性能之间的平衡。