在線生成JVM參數配置
堆參數設置
-XX:+PrintGC
使用這個參數,虛擬機啟動后,只要遇到GC就會打印日志。
-XX:+PrintGCDetails
可以查看詳細信息,包括各個區的情況
-XX:+PrintHeapAtGC
打印 GC 前后的詳細堆棧信息
-Xms
設置Java程序啟動時初始化JVM堆內存大小。
-Xmx
設置Java程序能獲得最大JVM堆內存大小。
在實際工作中,我們可以直接將初始的堆大小與最大堆大小設置相等,這樣的好處是可以減少程序運行時的垃圾回收次數,從而提高性能。
-XX:+PrintFlagsInitial
打印JVM初始化參數。
-XX:+PrintFlagsFinal
標記人為修改過的參數。
-XX:+PrintCommandLineFlags
查看默認垃圾回收器。
新生代參數設置
-XX:NewSize=5m
設置新生代最小空間大小
-XX:MaxNewSize=10m
設置新生代最大空間大小
-Xmn2g
可以設置新生代的大小,設置一個比較大的新生代會減少老年代的大小,這個參數對系統性能以及GC行為有很大的影響,新生代大小一般會設置整個堆空間的1/3。
-XX:SurvivorRatio=8(默認)
用來設置新生代中eden空間和from/to空間的比例。含義:-XX:SurvivorRatio=eden/from=eden/to。基本策略:盡可能將對象預留在新生代,減少老年代的GC次數。
-XX:NewRatio=2(默認)
設置新生代和老年代的比例:-XX:NewRatio=老年代/新生代。
對象進入老年代參數設置
-XX:MaxTenuringThreshold=15
新生代每次GC之后如果對象沒有被回收,則年齡加1,默認情況下為15
堆溢出參數配置
-XX:+HeapDumpOnOutOfMemoryError
使用該參數可以在內存溢出時導出整個堆信息
-XX:HeapDumpPath=D:/OOM.dump
可以設置導出堆的存放路徑。
堆棧相關參數配置
-Xss1m(默認)
來指定線程的最大棧空間
方法區相關參數配置
JDK1.2 ~ JDK6,使用永久代來實現方法區
-XX:PermSize=64M
設置永久代最小空間大小。
-XX:MaxPermSize=64M(默認)
如果系統運行時生產大量的類,就需要設置一個相對合適的方法區,以免出現永久區內存溢出的問題。
Java8,元空間取代永久代,存儲位置不同,永久代物理是堆的一部分,和新生代,老年代地址是連續的
而元數據放到本地化的堆內存(native heap)中,這一塊區域就叫Metaspace,中文名叫元空間。
存儲內容不同,元空間存儲類的元信息
靜態變量和常量池等並入堆中。
相當於永久代的數據被分到了堆和元空間中。
-XX:MetaspaceSize=128m(默認)
初始化大小。
-XX:MaxMetaspaceSize=128m
JVM默認在運行時根據需要動態地設置MaxMetaspaceSize的大小。
直接內存(堆外內存)參數配置
-XX:MaxDirectMemorySize=64m
該值是有上限的,默認是64M,最大為sun.misc.VM.maxDirectMemory()。 直接內存使用達到上限時,就會觸發垃圾回收(Full GC),如果不能有效的釋放空間,就會引起系統的OOM。
注:heap ByteBuffer,該類對象分配在JVM的堆內存里面,直接由Java虛擬機負責垃圾回收。
direct ByteBuffer是通過jni在虛擬機外內存中分配的。
生命周期中等或較長的對象,適合堆外內存。
直接的文件拷貝操作,或者I/O操作,適合堆外內存:
直接使用堆外內存就能少去資源從用戶內存拷貝到系統內存的操作。
DirectByteBuffer是通過虛引用(Phantom Reference)來實現堆外內存的釋放的:
虛引用主要被用來跟蹤對象被垃圾回收的狀態,
通過查看引用隊列(ReferenceQueue)中是否包含對象所對應的虛引用來判斷它是否即將被垃圾回收,從而采取行動。
它並不被期待用來取得目標對象的引用。
初始化DirectByteBuffer對象時,如果當前堆外內存的條件很苛刻時,會主動調用System.gc()強制執行Full GC。
TLAB參數配置
Thread Local Allocation Buffer即線程本地分配緩存:
一個線程專用的內存分配區域,是為了加速對象分配對象而生的。
每一個線程都會產生一個TLAB,該線程獨享的工作區域,Java虛擬機使用這種TLAB區來避免多線程沖突問題,提高了對象分配的效率。
-XX:+UseTLAB(默認開啟)
使用TLAB
-XX:TLABSize=64k(默認)
設置TLAB初始化大小
-XX:TLABRefillWasteFraction=64
設置維護進入TLAB空間的單個對象大小,它是一個比例值,默認為64,即如果對象大於整個空間的1/64,則在堆創建對象。
-XX:+ResizeTLAB
自調整TLABRefillWasteFraction閾值。
-XX:+PrintTLAB
查看TLAB信息