設定堆 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}

大小以位元組為單位。