GC回收的地方主要是在堆空间进行回收(堆分年轻代和老年代,年轻代分Eden和两个Survivor区域) 1. 对象的可回收的判定方法 1)引用计数器 每个对象中有个引用计数器,每当被引用一次,计数器的数值加一。当计数器的值为0,则会被GC回收。 基本不用这种方式作为判断对象是否能进行回收,因为如果出现两个对象互相引用,两个计数器的值不可能为0。 2)可达性分析算法 以GC Roots为根节点,比如A节点引用了这些根节点,然后B又引用了A,以此类推,形成一条链路,当某些对象不存在这些链路上的时候,这些对象就有可能会被回收。 GC Roots:虚拟机栈栈帧中的变量、方法区的静态变量、常量等。 2. 回收算法 1)标记-清除 标记可回收的对象,然后回收这些对象。会产生内存碎片。 2)复制算法 准备两块内存块,将存活的对象复制到另外一块上,然后将另一块的所有对象全部清除掉。解决了内存碎片的问题,但是内存浪费严重。 3)标记-整理 标记可回收对象,然后使存活对象向内存块的一端移动,最后回收可回收对象。这样不会产生内存碎片。 3. 垃圾收集器 主要讲两个Parallel Secavenge 和G1收集器 Parallel Secavenge:用于新生代的收集,采用复制算法,并行(多线程进行垃圾收集,有STW) Parallel Old:用于老年代,标记整理算法,并行 G1:G1收集器中,不再有年轻代老年代统一的物理内存块的划分,而是将堆划分一个个小块区域,里面的区域有充当原来年轻代老年代的职责。就是不再是整块整块的了,拆分成一个个小区域。采用复制、标记整理算法,分别对应年轻代区域和老年代区域。并发收集。(G1收集器中,堆还多了一种区域Humongous,用于存放短命的巨型对象)
java8默认Parallel Secavenge+Parallel Old java9默认G1