JVM參數
標簽(空格分隔): JVM
重要參數
-Xms and -Xmx (or:-XX:InitialHeapSize and -XX:MaxHeapSize)
-Xms
的作用是 定義堆的初始化大小,默認值是 物理內存的1/64(<1GB),默認(MinHeapFreeRatio參數可以調整)空余堆內存小於40%,JVM就會增大堆直到-Xmx
的最大限制。
-Xmx
的作用是 定義最大堆的大小,默認為物理內存的1/4(< 1GB),默認(MaxHeapFreeRatio參數可以調整)空余堆內存大於70%時,JVM會減少堆直到-Xms
的大小。
一般來說,這兩個參數的數值單位是Byte,但同時它們也支持使用其他單位(k,m,g)。舉個例子,下面的命令啟動了一個初始化堆內存為128M,最大堆內存為2G,名為“MyAPP”的Java應用程序。
java -Xms128m -Xmx2g MyApp
在實際使用過程中,初始化堆內存的大小通常被視為堆內存大小的下界。然后JVM可以在運行時動態的調整堆內存的大小,所以理論上來說我們有可能會看到堆內存的大小小於初始化堆內存的大小。但是即使在非常低的堆內存使用下,我也從來沒有遇到過這種情況。這種行為將會方便開發者和系統管理員,因為我們可以通過將-Xms
和-Xmx
設置為相同大小來獲得一個固定大小的堆內存。 -Xms
和-Xmx
實際上是-XX:InitialHeapSize
和-XX:MaxHeapSize
的縮寫。我們也可以直接使用這兩個參數,它們所起得效果是一樣的:
java -XX:InitialHeapSize=128m -XX:MaxHeapSize=2g MyApp
需要注意的是,所有JVM關於初始或最大堆內存大小的輸出都是使用它們的完整名稱:InitialHeapSize
和InitialHeapSize
。所以當你查詢一個正在運行的JVM的堆內存大小時,如使用-XX:+PrintCommandLineFlags
參數或者通過JMX查詢,你應該尋找InitialHeapSize
和InitialHeapSize
標志而不是Xms
和Xmx
。
在實際使用中,我們常常將 -Xms
和-Xmx
的大小設置一致,以避免每次垃圾回收完成后JVM重新分配內存。
-Xmn
-Xmn
的作用主要是定義 年輕代的大小。整個JVM內存的大小 = 年輕代大小 + 老年代大小 + 持久代大小。通常情況下,持久代一般固定大小為64m,所以增大年輕代后,將會減少老年代大小。此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8。
java -Xms128m -Xmx2g -Xmn1g MyApp
上面的命令就是以年輕代2g的大小啟動 MyApp進程。
-Xss
-Xss
的主要作用是 設置每個線程的堆棧大小。JDK5.0以后每個線程堆棧大小為1M,以前每個線程堆棧大小為256K,可根據具體應用線程所需內存大小進行 調整。在相同物理內存下,減小這個值能生成更多的線程。但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右一般小的應用,如果棧不是很深,應該是128k夠用的,稍大的應用建議使用256k。這個選項對性能影響比較大,需要嚴格的測試。
-XX:PermSize & -XX:MaxPermSize
-XX:PermSize
的作用是 設置持久代的初始化大小值。默認是物理內存的1/64。
-XX:MaxPermSize
的作用是 設置持久代的最大值,默認是物理內存的1/4。
永久代是JDK1.8以下版本對 方法區的具體實現。主要存放了一些元數據,例如Class、Method的元信息。為了成功運行應用程序,JVM會加載很多類(因為它們依賴於大量的第三方庫,而這又依賴於更多的庫並且需要加載這些類)這就需要增大永久代的大小。我們可以使用-XX:PermSize
和-XX:MaxPermSize
來達到這個目的。下面是一個簡單的例子:
java -XX:PermSize=64m -XX:MaxPermSize=256m MyApp
請注意,這里設置的永久代大小並不會被包括在參數XX:MaxHeapSize
設置的堆內存大小中。我的理解是:MaxHeapSize是
設置的堆(Heap)的大小,MaxPermSize
設置的是永久代(方法區具體實現)的區域大小,也就是說兩個參數設置的都不是一個區域。
其他參數
參數 | 含義 | 默認值 | 說明 |
---|---|---|---|
-XX:NewRatio | 年輕代(包括Eden和兩個Survivor區)與年老代的比值(除去持久代) | -XX:NewRatio=4表示年輕代與年老代所占比值為1:4 年輕代占整個堆棧的1/5Xms=Xmx並且設置了Xmn的情況下,該參數不需要進行設置。 |
|
-XX:SurvivorRatio | 設置Eden區與Survivor區的大小比值 |