JVM參數配置


堆參數設置

-XX:+PrintGC
    使用這個參數,虛擬機啟動后,只要遇到GC就會打印日志

-XX:+PrintGCDetails
    可以查看詳細信息,包括各個區的情況

-XX:+PrintHeapAtGC
    打印 GC 前后的詳細堆棧信息


-Xms3550m(默認物理內存的64分之一)
    設置Java程序啟動時初始化JVM堆內存大小

-Xmx3550m(默認物理內存的4分之一)
    設置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
    可以設置導出堆的存放路徑。

垃圾回收器

串行垃圾回收器(單個垃圾回收線程,所有其他工作線程暫停:STW):

    -XX:+UseSerialGC(年輕代復制算法,年老代標記-整理算法)
        配置串行回收器,開啟后新,老都是串行垃圾回收。

串行收集器特別適合堆內存不高、單核甚至雙核CPU的場合。


並行垃圾回收器(多個垃圾回收線程,所有其他工作線程暫停:STW):

    -XX:+UseParallelGC(復制算法)(與下面配置選擇其中一個即可,可以互相激活)
    -XX:+UseParallelOldGC(標記-整理算法)
        配置年輕代,年老代垃圾收集方式為並行收集。 JDK6.0 支持對年老代並行收集。

    -XX:ParallelGCThreads=4
        配置並行收集器的線程數,即:同時多少個線程一起進行垃圾回收。此值最好配置與處理器數目相等。

    -XX:+UseAdaptiveSizePolicy
        設置此選項后,並行收集器會自動選擇年輕代區大小和相應的 Survivor 區比例,
        以達到目標系統規定的最低相應時間或者收集頻率等,此值建議使用並行收集器時,一直打開。

    -XX:MaxGCPauseMillis=100
        設置每次並發收集最大停頓時間。設定此值可能會減少應用的吞吐量。
        ParallelGC 工作時,會調整 Java 堆大小或者其他的一些參數,盡可能的把停頓時間控制在 MaxGCPauseMillis 以內。

並行收集器適合對吞吐量要求遠遠高於延遲要求的場合。
(吞吐量:應用程序線程用時占程序總用時的比例,暫停時間:一個時間段內應用程序線程讓與GC線程執行而完全暫停)


並發垃圾回收器(並發-標記-清除算法)(多個垃圾回收線程,用戶線程不暫停:CMS)(只針對年老代):

    -XX:+UseParNewGC(復制算法)(自動激活UseConcMarkSweepGC年老代並發垃圾回收器)(STW)
        選擇新生代垃圾收集器為並行收集器。

    -XX:+UseConcMarkSweepGC(標記-清除算法)(自動激活UseParNewGC年輕代並發垃圾回收器)(CMS)
        設置年老代為並發收集。
        此回收器出錯后,備用是Serial Old串行回收器,如果在回收完成之前堆內存耗盡,CMS回收失敗。

    -XX:+UseCMSCompactAtFullCollection
        打開對年老代的壓縮。可能會影響性能,但是可以消除碎片。參數指定每次 CMS 后進行一次碎片整理。

    -XX:CMSFullGCsBeforeCompaction=5
        由於並發收集器不對內存空間進行壓縮、整理,
        所以運行一段時間以后會產生“碎片”,使得運行效率降低。
        此值設置運行多少次 GC 以后對內存空間進行壓縮、整理。

    -XX:ParallelGCThreads=4
        指定 GC 工作線程數量。

    -XX:ParallelCMSThreads=4
        設定 CMS 並發線程數。

CMS並發收集、低停頓。非常適合堆內存大、CPU核數多的服務器端應用。
注重服務的響應速度,希望系統停頓時間最短,給用戶帶來更好的體驗等場景下。如web程序、b/s服務。


G1垃圾回收器(年輕代垃圾回收會暫停所有其他線程:STW):

    年輕代的垃圾收集, 會發生stop the world。 在回收時所有的應用程序線程都會被暫停。通過多線程並行進行。

    收集器可以工作在young 區,也可以工作在 old 區。

    -XX:UseG1GC(並行+並發)(不會產生碎片)
        存儲不需要物理上連續,只需要邏輯上連續。

    -XX:G1HeapRegionSize=n
        指定分區大小(1mb-32mb,必須是2的冪),默認2048個分區。

    -XX:MaxGCPauseMillis=100(單位毫秒)
        設置每次並發收集最大停頓時間。設定此值可能會減少應用的吞吐量。
        如果任何一次停頓超過這個設置值時,G1 就會嘗試調整新生代和老年代的比例,調整堆大小,調整晉升年齡的手段,試圖達到目標。

    -XX:GCPauseIntervalMillis=n
        設置停頓時間間隔。

    -XX:ParallelGCThreads=4
        由於是並行並發的,可以指定 GC 工作線程數量。

G1的收集,年輕代和老年代的收集界限比較模糊,采用了混合(mixed)收集的方式。
即每次收集既可能只收集年輕代分區(年輕代收集),也可能在收集年輕代的同時,包含部分老年代分區(混合收集)

G1的應用場合往往堆內存都比較大,所以Full GC(可用內存不足時觸發)的收集代價非常昂貴,應該避免Full GC的發生。

G1能夠獨自管理整個Java堆,並行與並發,不會產生空間碎片,低停頓,可預測的停頓。

棧參數配置

-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。

https://www.cnblogs.com/duanxz/p/6089485.html

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信息

參考

https://blog.csdn.net/weixin_37195606/article/details/82805216


免責聲明!

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



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