什么是GC
垃圾回收,全稱garbage collector规揪。
什么是垃圾泳姐?
一個對象沒有任何引用指向它那就是垃圾。
垃圾回收器怎么找到垃圾匆篓?
1.引用計數(shù):對象記錄被引用指向的數(shù)量浑度,變成0時就成為垃圾。不能解決循環(huán)引用問題
2.根可達(dá)算法(JVM使用):從程序運行的根對象往下找鸦概,能找到的都是有用的對象箩张,剩下的就是垃圾
垃圾清除算法有哪些?
1.Mark-Sweep(標(biāo)記清除法):標(biāo)記垃圾直接清除,產(chǎn)生內(nèi)存碎片先慷,內(nèi)存不連續(xù)
2.Copying(拷貝法):內(nèi)存一分為二饮笛,回收垃圾后將有用對象拷貝到另一半內(nèi)存,解決了標(biāo)記清除法內(nèi)存碎片問題论熙,但是浪費內(nèi)存空間
3.Mark-Compact(標(biāo)記壓縮法):將有用對象挪動福青、壓縮到一邊,解決了前兩個算法問題脓诡,但是效率偏低无午,因為需要挪對象、清理垃圾誉券、壓縮內(nèi)存
垃圾回收器
1.一共有10中垃圾回收器指厌,JVM堆內(nèi)存的管理是由垃圾回收器決定的,線上JVM調(diào)優(yōu)必須清楚JDK版本和垃圾回收器種類踊跟。
10中垃圾回收器
2.windows查看使用哪種垃圾回收器命令踩验,linux未提供:java -XX:+PrintCommandLineFlags -version
windows查看JVM垃圾回收器
3.JDK8垃圾回收器組合
-xx:+UseSerialGC = Serial New (DefNew) + Serial Old
小型程序,默認(rèn)情況下不會是這種選項商玫,HotSpot會根據(jù)計算機配置和JDK版本自動選擇收起器
-xx:+UseParNewGC = ParNew + SerialOld
這個組合已經(jīng)很少用
-xx:+UseConcurrentMarkSweepGC = ParNew + CMS + Serial Old
-xx:+UseParallelGC = Parallel Scavenge + Parallel Old(1.8默認(rèn))
-xx:+UseG1GC = G1
4.內(nèi)存分代模型
新生代:老年代 = 1 :2
分代模型
5.分代規(guī)則
新創(chuàng)建的對象在新生代箕憾,沒經(jīng)過一次垃圾回收,存貨下來的對象年齡+1拳昌,當(dāng)達(dá)到一定程度袭异,會進(jìn)入老年代
6.分代應(yīng)用回收算法
新生代:頻繁生成對象,但存活對象少炬藤,應(yīng)用復(fù)制算法御铃,復(fù)制到survivor1、survivor2
老年代:存活對象多沈矿,應(yīng)用標(biāo)記清除或標(biāo)記標(biāo)記壓縮算法
7.分代回收模型
新生成對象進(jìn)入stack中上真,然后進(jìn)入eden區(qū),經(jīng)過一次GC進(jìn)入survivor1羹膳,再經(jīng)過一次GC進(jìn)入survivor2睡互,再經(jīng)過一次回收進(jìn)入survivor1... 可以通過-XX:MaxTenuringThreshold配置最大年齡,達(dá)到最大年齡進(jìn)入old(一般垃圾回收最大年齡默認(rèn)15陵像,CMS默認(rèn)6)
分代回收模型.jpg
8.GC概念
GC概念.jpg
9.對象回收模型
新new對象放入棧中就珠,如果不使用直接pop,不需要經(jīng)過GC醒颖,效率很高妻怎。不放入棧中,看對象是否夠大泞歉,夠大放入老年代蹂季,經(jīng)過FULLGC回收冕广。不夠大放入TLAB,最終進(jìn)入新生代偿洁,經(jīng)過幾次GC進(jìn)入老年代或者被回收撒汉。
對象回收過程.jpg