對(duì)象被判定為垃圾的標(biāo)準(zhǔn):沒(méi)有被其他對(duì)象引用
用引用計(jì)數(shù)法和可達(dá)性分析算法判斷是否為垃圾:

引用計(jì)數(shù)法

優(yōu)缺點(diǎn)

例如

image.png

image.png
不可達(dá)的對(duì)象都回收,非綠色的
第一種,標(biāo)記清除

image.png

image.png
缺點(diǎn):內(nèi)存碎片,內(nèi)存不連續(xù)
第二種標(biāo)記復(fù)制

image.png
用來(lái)回收年輕代:

image.png
第三種標(biāo)記整理

image.png

image.png
第四種分代收集

image.png

image.png

image.png

image.png
Eden又滿了, s0中的1加1放入s1,Eden同理,之后清空Eden和s0(所以使用的是標(biāo)記復(fù)制算法)
Minor GC:從年輕代空間(包括 Eden 和 Survivor 區(qū)域)回收內(nèi)存被稱為 Minor GC
Major GC 是清理老年代。
Full GC 是清理整個(gè)堆空間—包括年輕代和老年代。
何時(shí)晉升老年代?

image.png

image.png
老年代一般使用標(biāo)記整理或者標(biāo)記清除

image.png

image.png

image.png
分析節(jié)點(diǎn)必須具備確定性,引用關(guān)系不能再變化了
年輕代的垃圾收集器:

image.png
簡(jiǎn)單高效,通常client用

image.png
通常多核cpu,server用

image.png
老年代的垃圾收集器:

image.png

image.png

image.png
G1收集器新老代都可以

image.png

image.png
GC的相關(guān)面試題:

image.png
如何自救:
import java.lang.ref.ReferenceQueue;
public class Finalization {
public static Finalization finalization;
@Override
protected void finalize(){
System.out.println("Finalized");
finalization = this;
}
public static void main(String[] args) {
Finalization f = new Finalization();
System.out.println("First print: " + f);
f = null;
System.gc();
try {// 休息一段時(shí)間,讓上面的垃圾回收線程執(zhí)行完成
Thread.currentThread().sleep(1000);
} catch (InterruptedException e){
e.printStackTrace();
}
System.out.println("Second print: " + f);
System.out.println(f.finalization);
}
}
強(qiáng)引用、軟引用、弱引用、虛引用

強(qiáng)引用

image.png

image.png

image.png

image.png
引用隊(duì)列的作用:存強(qiáng)引用之外的與之關(guān)聯(lián)的對(duì)象

image.png