ps: 參考? ?jvm機制? ??jvm的新生代里為什么有兩個Survivor區(qū)??FullGC優(yōu)化實戰(zhàn)
1. java 垃圾回收機制的主要任務(wù)
? ? ? ? ?.分配內(nèi)存
? ? ? ? ?. 確保被引用的內(nèi)存不被錯誤的回收
? ? ? ? ?. 回收不再被引用的內(nèi)存對象
2. java 內(nèi)存區(qū)域
? ?了解java虛擬機的回收機制之前,需要先熟悉內(nèi)存是怎么劃分的。

????????程序計數(shù)器: 指示當(dāng)前程序執(zhí)行到哪一行,執(zhí)行JAVA方法時紀(jì)錄正在執(zhí)行的虛擬機字節(jié)碼指令地址;執(zhí)行本地方法時,計數(shù)器值為undefined
????????虛擬機棧: 用于執(zhí)行JAVA方法。棧幀存儲局部變量表、操作數(shù)棧、動態(tài)鏈接、方法返回地址和一些額外的附加信息。程序執(zhí)行時棧幀入棧;執(zhí)行完成后棧幀出棧
? ? ? ? 本地方法棧: 用于執(zhí)行本地方法,其他和虛擬機棧類似
共享內(nèi)存區(qū):
? ??JAVA堆:AVA虛擬機管理的內(nèi)存中最大的一塊,所有線程共享,幾乎所有的對象實例和數(shù)組都在這類分配內(nèi)存。GC主要就是在JAVA堆中進行的。
? ? 方法區(qū):用于存儲已被虛擬機加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)。但是已經(jīng)被最新的 JVM 取消了。現(xiàn)在,被加載的類作為元數(shù)據(jù)加載到底層操作系統(tǒng)的本地內(nèi)存區(qū)。
3 垃圾回收算法概述
追蹤回收算法(tracing collector)?
從根結(jié)點開始遍歷對象的應(yīng)用圖。同時標(biāo)記遍歷到的對象。遍歷完成后,沒有被標(biāo)記的對象就是目前未被引用,可以被回收。
壓縮回收算法(Compacting Collector)?
把堆中活動的對象集中移動到堆的一端,就會在堆的另一端流出很大的空閑區(qū)域。這種處理簡化了消除碎片的工作,但可能帶來性能的損失。
復(fù)制回收算法(Coping Collector)
把堆均分成兩個大小相同的區(qū)域,只使用其中的一個區(qū)域,直到該區(qū)域消耗完。此時垃圾回收器終端程序的執(zhí)行,通過遍歷把所有活動的對象復(fù)制到另一個區(qū)域,復(fù)制過程中它們是緊挨著布置的,這樣也可以達到消除內(nèi)存碎片的目的。復(fù)制結(jié)束后程序會繼續(xù)運行,直到該區(qū)域被用完。
按代回收算法(Generational Collector)
為什么要按代進行回收?這是因為不同對象生命周期不同,每次回收都要遍歷所有存活對象,對于整個堆內(nèi)存進行回收無疑浪費了大量時間,對癥下藥可以提高垃圾回收的效率。主要思路是:把堆分成若搞個子堆,每個子堆視為一代,算法在運行的過程中優(yōu)先收集“年幼”的對象,如果某個對象經(jīng)過多次回收仍然“存活”,就移動到高一級的堆,減少對其掃描次數(shù)。
4. jvm相關(guān)回收算法使用的參數(shù)
1. 與串行回收器相關(guān)的參數(shù)
-XX:+UseSerialGC:在新生代和老年代使用串行回收器。
-XX:+SuivivorRatio:設(shè)置 eden 區(qū)大小和 survivor 區(qū)大小的比例。
-XX:+PretenureSizeThreshold:設(shè)置大對象直接進入老年代的閾值。當(dāng)對象的大小超過這個值時,將直接在老年代分配。
-XX:MaxTenuringThreshold:設(shè)置對象進入老年代的年齡的最大值。每一次 Minor GC 后,對象年齡就加 1。任何大于這個年齡的對象,一定會進入老年代。
2. 與并行 GC 相關(guān)的參數(shù)
-XX:+UseParNewGC: 在新生代使用并行收集器。
-XX:+UseParallelOldGC: 老年代使用并行回收收集器。
-XX:ParallelGCThreads:設(shè)置用于垃圾回收的線程數(shù)。通常情況下可以和 CPU 數(shù)量相等。但在 CPU 數(shù)量比較多的情況下,設(shè)置相對較小的數(shù)值也是合理的。
-XX:MaxGCPauseMills:設(shè)置最大垃圾收集停頓時間。它的值是一個大于 0 的整數(shù)。收集器在工作時,會調(diào)整 Java 堆大小或者其他一些參數(shù),盡可能地把停頓時間控制在 MaxGCPauseMills 以內(nèi)。
-XX:GCTimeRatio:設(shè)置吞吐量大小,它的值是一個 0-100 之間的整數(shù)。假設(shè) GCTimeRatio 的值為 n,那么系統(tǒng)將花費不超過 1/(1+n) 的時間用于垃圾收集。
-XX:+UseAdaptiveSizePolicy:打開自適應(yīng) GC 策略。在這種模式下,新生代的大小,eden 和 survivor 的比例、晉升老年代的對象年齡等參數(shù)會被自動調(diào)整,以達到在堆大小、吞吐量和停頓時間之間的平衡點。
3. 與 CMS 回收器相關(guān)的參數(shù)
-XX:+UseConcMarkSweepGC: 新生代使用并行收集器,老年代使用 CMS+串行收集器。
-XX:+ParallelCMSThreads: 設(shè)定 CMS 的線程數(shù)量。
-XX:+CMSInitiatingOccupancyFraction:設(shè)置 CMS 收集器在老年代空間被使用多少后觸發(fā),默認為 68%。
-XX:+UseFullGCsBeforeCompaction:設(shè)定進行多少次 CMS 垃圾回收后,進行一次內(nèi)存壓縮。
-XX:+CMSClassUnloadingEnabled:允許對類元數(shù)據(jù)進行回收。
-XX:+CMSParallelRemarkEndable:啟用并行重標(biāo)記。
-XX:CMSInitatingPermOccupancyFraction:當(dāng)永久區(qū)占用率達到這一百分比后,啟動 CMS 回收 (前提是-XX:+CMSClassUnloadingEnabled 激活了)。
-XX:UseCMSInitatingOccupancyOnly:表示只在到達閾值的時候,才進行 CMS 回收。
-XX:+CMSIncrementalMode:使用增量模式,比較適合單 CPU。
4. 與 G1 回收器相關(guān)的參數(shù)
-XX:+UseG1GC:使用 G1 回收器。
-XX:+UnlockExperimentalVMOptions:允許使用實驗性參數(shù)。
-XX:+MaxGCPauseMills:設(shè)置最大垃圾收集停頓時間。
-XX:+GCPauseIntervalMills:設(shè)置停頓間隔時間。
5. 其他參數(shù)
-XX:+DisableExplicitGC: 禁用顯示 GC。