前言
作為一名Java開發工程師,基本上都要接觸到JVM,實際開發中也許也會遇到JVM的相關問題,面試中肯定也會問到JVM的相關知識。是以今天這篇主要分享JVM的各個參數所代表的意思并且通過圖解的方式幫助讀者更加好了解。
JVM核心參數
在JVM裡有幾個比較核心的參數,今天就主要來講這幾個:
-Xms:JVM初始堆記憶體大小
-Xmx:JVM堆記憶體的最大值
-Xmn:JVM中新生代大小
-XX:PermSize:永久代大小
-XX:MaxPermSize:永久代最大值
-Xss:JVM每個線程的大小
下面我們就對上面列舉的幾個核心參數進行說明。
1、-Xms和-Xmx分别表示JVM初始堆記憶體大小和堆記憶體最大值
這兩個參數主要作用就是限定JVM中堆記憶體的大小。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPR5EeRpmT0kleOpHOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLwgzN0AjNyETM1ETNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
2、-Xmn:表示JVM堆記憶體中新生代的大小
一般設定完堆記憶體,然後用堆記憶體-新生代大小=老年代大小
3、-XX:PermSize和-XX:MaxPermSize,分别代表永久代的大小和永久代的最大值
如果在JDK8以後,永久代被元空間替代了,是以這兩個參數變成了-XX:MetaspaceSize和-XX:MaxMetaspaceSize。這兩個參數就是限定永久代的大小。
實際用元空間代替永久代可以避免OOM,因為元空間用的是本地記憶體,不同于永久代是有上限的。更深層的原因是要合并HotSpot和JRockit,然後JRockit沒有永久代,是以就使用了元空間。
4、-Xss:這個參數限定了JVM每個參數的大小
每個線程都有自己一個虛拟機棧,每次執行一個方法,就會把方法的棧幀壓入棧中,方法執行完,該棧幀就會從線程裡的棧出棧
啟動系統的時候配置JVM參數
在自己的編譯器(以Idea舉例)設定啟動時JVM參數,可以加快Idea的編譯速度
在啟動的main類選擇Edit Configurations,然後在VM options配置JVM參數即可
除了以上的方法外,還有第二種方法是打開idea.vmoptions修改配置資訊,一般在idea的Help菜單下的Edit Custom VM Options
把編譯器的堆記憶體改大就可以使編譯速度提高(當然也不是絕對的,大部分情況下可以)
線上部署應用的時候如何指定JVM參數
這個其實就很簡單,舉例采用"java -jar"的方式啟動應用,可以采用以下的方式:
java -Xms512M -Xmx512M -Xmn256M -Xss1M -XX:PermSize=128M -XX:MaxPermSize=128M -jar test.jar
其他方式部署的也是可以配置啟動參數,感興趣可以自行了解。
最後分享
分享了JVM的核心參數之後,最後想說一句,其實JVM參數該如何配置,應該是根據不同的業務具體的一些場景來決定的,而不是說有一個固定的配置子產品,一切都要從業務場景出發。