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