设置堆 PermGen 和堆栈大小

当 Java 虚拟机启动时,它需要知道堆的大小和线程堆栈的默认大小。可以使用 java 命令上的命令行选项指定这些选项。对于 Java 8 之前的 Java 版本,你还可以指定堆的 PermGen 区域的大小。

请注意,在 Java 8 中删除了 PermGen,如果你尝试设置 PermGen 大小,则将忽略该选项(带有警告消息)。

如果未明确指定堆大小和堆栈大小,则 JVM 将使用以版本和平台特定方式计算的缺省值。这可能会导致你的应用程序使用太少或太多的内存。这通常适用于线程堆栈,但对于使用大量内存的程序来说可能会有问题。

设置 Heap,PermGen 和默认堆栈大小:

以下 JVM 选项设置堆大小:

  • -Xms<size> - 设置初始堆大小
  • -Xmx<size> - 设置最大堆大小
  • -XX:PermSize<size> - 设置初始 PermGen 大小
  • -XX:MaxPermSize<size> - 设置最大 PermGen 大小
  • -Xss<size> - 设置默认的线程堆栈大小

<size> 参数可以是多个字节,或者可以具有 kmg 的后缀。后者分别以千字节,兆字节和千兆字节为单位指定大小。

例子:

$ java -Xms512m -Xmx1024m JavaApp
$ java -XX:PermSize=64m -XX:MaxPermSize=128m JavaApp
$ java -Xss512k JavaApp

查找默认大小:

-XX:+printFlagsFinal 选项可用于在启动 JVM 之前打印所有标志的值。这可用于打印堆和堆栈大小设置的默认值,如下所示:

  • 适用于 Linux,Unix,Solaris 和 Mac OSX

    $ java -XX:+ PrintFlagsFinal -version | grep -iE’HapSize | PermSize | ThreadStackSize'

  • 对于 Windows:

    java -XX:+ PrintFlagsFinal -version | findstr / iHeapSize PermSize ThreadStackSize

上述命令的输出类似于以下内容:

uintx InitialHeapSize                          := 20655360        {product}
uintx MaxHeapSize                              := 331350016       {product}
uintx PermSize                                  = 21757952        {pd product}
uintx MaxPermSize                               = 85983232        {pd product}
 intx ThreadStackSize                           = 1024            {pd product}

大小以字节为单位。