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
13万+

被折叠的 条评论
为什么被折叠?



