垃圾回收机制

垃圾回收机制

自动垃圾收集

如何确定内存需要被回收

引用计数

优点:实现简单,判定效率高

缺点:很难解决相互循环引用的问题

可达性分析

算法

引用类型和可达性级别

ps:Object obj = new Object()这类的引用,就是强引用

垃圾收集算法

标记-清除算法

虽然内存里面有16个字节的内存,但是再有个16字节的大对象,会存不进去。这就是内存碎片化问题。

复制算法

需要划分两块同等大小的区域,收集时需将内存复制到另一块,复制+预留内存,空间浪费

标记-整理算法

标记-整理算法在标记清理过程中对对象进行移动,避免内存碎片化。

分代收集

Minor GC 和 Full GC 有什么不一样?

新生代GC(Minor GC) : 指发生在新生代的垃圾收集动作,因为java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。

老年代GC(Major GC / Full GC):指发生在老年代的GC,出现了Major GC,经常会伴随至少一次的Minor GC(但非绝对的,在Parallel Scavenge收集器的收集策略里就有直接进行Major GC的策略选择过程)。Major GC的速度一般会比Minor GC慢10倍以上。

新生代GC

-XX:MaxTenuringThreshold默认是15

新生代 Eden:from:to -> 1:1:8

新生代:老年代 -> 1:2

大对数情况下,对象在新生代Eden区中分配,当Eden区没有足够空间进行分配时,虚拟机Minor GC。经历过第一次Minor GC后仍然存活,并且能被Survior容纳的话,将被移动到Survior空间中,并且对象年龄设为1。对象在Survivor区中每熬过一次Minor GC,年龄就增加一岁,当年龄达到-XX:MaxTenuringThreshold(默认是15),就将会晋升到老年代中。

新生代进入老年代的情况

1:在新生代区经历了-XX:MaxTenuringThreshold次GC,长期存活的对象进入老年代

2:新生代区内存不够时,新生成的对象会直接到达老年代

3:大对象直接进入老年代

老年代GC

所以新生代是通过复制算法,而老年代是通过标记-整理算法

垃圾收集器

CMS只有在初始标记,找GC root的时候会独占线程。

垃圾收集器组合