对象被判定为垃圾的标准:没有被其他对象引用
用引用计数法和可达性分析算法判断是否为垃圾:
不可达的对象都回收,非绿色的
第一种,标记清除
缺点:内存碎片,内存不连续
第二种标记复制
用来回收年轻代:
第三种标记整理
第四种分代收集
Eden又满了, s0中的1加1放入s1,Eden同理,之后清空Eden和s0(所以使用的是标记复制算法)
Minor GC:从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC
Major GC 是清理老年代。
Full GC 是清理整个堆空间—包括年轻代和老年代。
何时晋升老年代?
老年代一般使用标记整理或者标记清除
分析节点必须具备确定性,引用关系不能再变化了
年轻代的垃圾收集器:
简单高效,通常client用
通常多核cpu,server用
老年代的垃圾收集器:
G1收集器新老代都可以
GC的相关面试题:
如何自救:
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 {// 休息一段时间,让上面的垃圾回收线程执行完成
Thread.currentThread().sleep(1000);
} catch (InterruptedException e){
e.printStackTrace();
}
System.out.println("Second print: " + f);
System.out.println(f.finalization);
}
}
强引用、软引用、弱引用、虚引用
引用队列的作用:存强引用之外的与之关联的对象