Intellij IDEA 設定啟動JVM引數
目錄
開啟 IDEA 安裝目錄,看到有一個 bin 目錄,其中有兩個 vmoptions 檔案,需針對不同的JDK進行配置:
採用CMS垃圾回收配置:
-server -Xms1024m -Xmx2048m -XX:MaxPermSize=1024m -XX:ReservedCodeCacheSize=512m -XX:+UseConcMarkSweepGC -XX:+UseCodeCacheFlushing -XX:SoftRefLRUPolicyMSPerMB=50 -ea -Dsun.io.useCanonCaches=false -Dsun.awt.keepWorkingSetOnMinimize=true -Djava.net.preferIPv4Stack=true -Djdk.http.auth.tunneling.disabledSchemes="" -Djsse.enablesSNIExtension=false -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Dfile.encoding=UTF-8 -Duser.name=qhong
採用G1垃圾回收配置:
-server -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=512M -XX:+AlwaysPreTouch -Xms128m -Xmx4g -XX:ReservedCodeCacheSize=512m -XX:+UseG1GC -XX:+UseStringDeduplication -XX:AutoBoxCacheMax=20000 -ea -Dsun.io.useCanonCaches=false -Dsun.awt.keepWorkingSetOnMinimize=true -Djava.net.preferIPv4Stack=true -Djdk.http.auth.tunneling.disabledSchemes="" -Djsse.enablesSNIExtension=false -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -Dfile.encoding=UTF-8 -Duser.name=qhong
引數說明:
通用引數:
Xms
初始化堆記憶體大小
Xmx
堆記憶體最大值
ReservedCodeCacheSize
-XX:InitialCodeCacheSize and -XX:ReservedCodeCacheSize
JVM一個有趣的,但往往被忽視的記憶體區域是“程式碼快取”,它是用來儲存已編譯方法生成的原生代碼。程式碼快取確實很少引起效能問題,但是一旦發生其影響可能是毀滅性的。如果程式碼快取被佔滿,JVM會打印出一條警告訊息,並切換到interpreted-only 模式:JIT編譯器被停用,位元組碼將不再會被編譯成機器碼。因此,應用程式將繼續執行,但執行速度會降低一個數量級,直到有人注意到這個問題。就像其他記憶體區域一樣,我們可以自定義程式碼快取的大小。相關的引數是-XX:InitialCodeCacheSize 和-XX:ReservedCodeCacheSize,它們的引數和上面介紹的引數一樣,都是位元組值。
UseCodeCacheFlushing
如果程式碼快取不斷增長,例如,因為熱部署引起的記憶體洩漏,那麼提高程式碼的快取大小隻會延緩其發生溢位。為了避免這種情況的發生,我們可以嘗試一個有趣的新引數:當代碼快取被填滿時讓JVM放棄一些編譯程式碼。通過使用-XX:+UseCodeCacheFlushing 這個引數,我們至少可以避免當代碼快取被填滿的時候JVM切換到interpreted-only 模式
該值預設是開啟的
AutoBoxCacheMax=20000
JVM在載入Integer這個類時,會優先載入靜態的程式碼。當JVM程序啟動完畢後, -128 ~ +127 範圍的數字會被快取起來,呼叫valueOf方法的時候,如果是這個範圍內的數字,則直接從快取取出。
AlwaysPreTouch
JAVA程序啟動的時候,雖然我們可以為JVM指定合適的記憶體大小,但是這些記憶體作業系統並沒有真正的分配給JVM,而是等JVM訪問這些記憶體的時候,才真正分配,這樣會造成以下問題。
- GC的時候,新生代的物件要晉升到老年代的時候,需要記憶體,這個時候作業系統才真正分配記憶體,這樣就會加大young gc的停頓時間;
- 可能存在記憶體碎片的問題。
可以在JVM啟動的時候,配置
-XX:+AlwaysPreTouch
CMS機制才有的引數:
XX:+UseConcMarkSweepGC
採用cms垃圾回收機制
PermSize
JVM初始分配的非堆記憶體,就是永久代
-XX:PermSize=64M
-XX:MaxPermSize=128M
MaxPermSize
JVM最大允許分配的非堆記憶體,按需分配
G1機制才有的引數:
XX:+UseG1GC
G1垃圾回收機制
XX:MetaspaceSize
初始元空間大小,達到該值就會觸發垃圾收集進行型別解除安裝,同時GC會對該值進行調整:如果釋放了大量的空間,就適當降低該值;如果釋放了很少的空間,那麼在不超過MaxMetaspaceSize時,適當提高該值
XX:MaxMetaspaceSize
最大元空間,預設是沒有限制的。
XX:+UseStringDeduplication
G1垃圾回收器的時候,通過 JVM引數 -XX:+UseStringDeduplication
。 我們可以通過刪除重複的字串,只保留一個char[]來優化堆記憶體。