大家好,我是咸魚程序員(我想做最咸的那只)
分代垃圾回收算法
在jvm進行gc的時候會發(fā)生stop-the-world? ?而我們進行gc調優(yōu)就是減少stop-the-world的時間
分析過程中會保存一個景象 會生成一個安全點 safepoint:方法調用;循環(huán)跳轉;異常跳轉
安全點數量適中
常見的垃圾收集器
jvm的運行模式?
server? 啟動速度慢? 重量級的虛擬機
client 啟動速度快?

-XX:+UseSerialGc 復制算法 垃圾收集器? 單線程收集器 收集的時候必須要停止所有的工作線程? 默認年輕代的收集器
ParNew收集器 -XX:+UseParNewGc 復制算法 多線程收集 單線程使用最好的是Serial? ParNew最好使用多線程的情況下 使用這個收集器,來收集停止線程,出現(xiàn)了工作線程的收集器? ? 常用與年輕代的收集
只有Serial 和 ParNew可以與CMS配合一起使用
Parallel Scavenge收集器 -XX:+UseParallerGc? 復制算法? 多線程 類似ParNew 比較適合在后臺運算,而不合適更多的交互時間 比起用戶停頓更關注吞吐量? Paraller Scavenge 收集器可以配合Parallel Old的收集器來一起使用? ? Server模式下的默認年輕代垃圾收集器
通常使用Parallel Scavenge 和自動調優(yōu)策略一起使用 -XX:+UseAdaptiveSizePolicy
吞吐量=用戶代碼運行時間/(運行用戶代碼時間+垃圾回收時間)
使用其他的收集器會造成線程卡頓的狀態(tài)
老年代的常見的收集器
Serial old收集器? -XX:UseSerialOldGc? 標記整理算法? 給client模式下的老年代使用
Parallel Old收集器? ?-XX:+UseParallelOldGC 標記整理算法 jdk6以后出現(xiàn)的 吞吐量優(yōu)先
多線程?
CMS 幾乎stop-the-world很短 -XX:+UseConcMarkSweepGC 標記清除算法 對停頓比較敏感 可以使用CMS
1.步驟 初始標記 stop-the-world 會暫停jvm
2.并發(fā)標記 會并發(fā)追索標記 程序不會停頓
3.并發(fā)預清理 查找并發(fā)標記從年輕代晉升到老年代的對象? stop-the-world
4.重新標記 會重新掃描在CMS里面的對象 掃描CMS中的剩余對象
5.并發(fā)清理 清理垃圾對象 程序不會停頓
6.并發(fā)重置,重置 CMS的數據結構
問題:不能壓縮對象
?如果有一個連續(xù)的較大的對象,就只能進行一次GC
G1收集器? 即用于年輕代,右用于老年代? 復制和標記整理算法
-XX:+UseG1GC
特點
并行和并發(fā)
分代收集
空間整合
可預測的停頓
將java代碼劃分為多個Region?
年輕代和老年代不在隔離