JVM启动参数-Xmx的默认值是多少?

你也可以在程序里试试打印 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  -version | grep MaxHeapSize

 

过多的GC时间和OutOfMemoryError

OutOfMemoryError如果在垃圾收集(GC)中花费了太多时间,那么并行收集器会抛出:如果在垃圾收集中花费了超过98%的总时间并且回收了不到2%的堆,则OutOfMemoryError抛出a。此功能旨在防止应用程序长时间运行,同时由于堆太小而很少或没有进度。如有必要,可以通过向-XX:-UseGCOverheadLimit命令行添加选项来禁用此功能。

你可能感兴趣的:(java)