你也可以在程序里试试打印 Runtime.getRuntime().maxMemory()
的值 看看是多少
官网说明: 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默认初始和最大堆大小
要用 java -server <类名>
来启动你的程序 ..
默认的初始和最大堆大小在服务器JVM上的工作方式与在客户端JVM上的大小相同,只是默认值可以更高。在32位JVM上,如果有4 GB或更多的物理内存,则默认的最大堆大小可以高达1 GB。在64位JVM上,如果存在128 GB或更多物理内存,则默认最大堆大小最多可为32 GB。您可以通过直接指定这些值来设置更高或更低的初始和最大堆; 见下一节。
指定初始和最大堆大小
您可以使用标志-Xms
(初始堆大小)和-Xmx
(最大堆大小)指定初始和最大堆大小。如果您知道应用程序需要多少堆才能正常工作,则可以设置-Xms
并-Xmx
使用相同的值。如果没有,JVM将首先使用初始堆大小,然后增加Java堆,直到它在堆使用和性能之间找到平衡。
其他参数和选项可能会影响这些默认值。要验证默认值,请使用该-XX:+PrintFlagsFinal
选项并MaxHeapSize
在输出中查找。例如,在Linux或Solaris上,您可以运行以下命令:
java -XX:+ PrintFlagsFinal <GC options> -version | grep MaxHeapSize
过多的GC时间和OutOfMemoryError
OutOfMemoryError
如果在垃圾收集(GC)中花费了太多时间,那么并行收集器会抛出:如果在垃圾收集中花费了超过98%的总时间并且回收了不到2%的堆,则OutOfMemoryError
抛出a。此功能旨在防止应用程序长时间运行,同时由于堆太小而很少或没有进度。如有必要,可以通过向-XX:-UseGCOverheadLimit
命令行添加选项来禁用此功能。