打開 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[]來優化堆內存。