1. 程式人生 > >Intellij IDEA 設定啟動JVM引數

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[]來優化堆記憶體。

參考:

JVM調優-學習篇

Metaspace 之一:Metaspace整體介紹(永久代被替換原因、元空間特點、元空間記憶體檢視分析方法)

JVM實用引數(四)記憶體調優