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實用參數(四)內存調優


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM