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。

http://www.javashuo.com/article/p-bfpakfsh-p.htmlhtml

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/82805216web

相關文章
相關標籤/搜索