Java-GC

垃圾回收机制

Reference

  1. 引用计数法
  2. 可达性分析法:分两步:
    a. 若对象在进行可达性分析后发现没有与 GC roots 相连接的引用链,那么他将会被第一次标 记并进行一次筛选,筛选的条件是该对象是否有必要执行 finalize()方法
    b.若该对象被判定为有必要执行 finalize 方法,则这个对象会被放在一个 F-Queue 队列, finalize 方法是对象逃脱死亡命运的最后一次机会,稍后 GC 将对 F-queue 中的对象进行第二 次小规模的标记,若对象要在 finalize 中成功拯救自己—只要重新与引用链上的任何一个对 象建立关联即可,那么在第二次标记时他们将会被移出“即将回收”集合。

垃圾回收算法

  1. 停止-复制算法:
    它将可用内存按照容量划分为大小相等的两块,每次只使用其中一块。 当这一块的内存用完了,则就将还存活的对象复制到另一块上面,然后再把已经使用过的内 存空间一次清理掉。
    weakness: 存活率较高时要执行较多的复制操作,效率降低
  2. 标记-清除算法:
    先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。
    weakness: 产生大量不连续的内存空间
  3. 标记-清理算法:
    标记整理算法的“标记”过程和标记-清除算法一致,只是后面并不是直接对可回收对象进行整理,而是让所有存活的对象都向一段移动,然后直接清理掉端边界意外的内存
  4. 分代收集:新生代 停止-复制算法 老年代 标记-清理或标记-清除

JVM的新生代,老年代

新生代:Eden, Survivor
1)大多数情况下,对象在新生代 eden 区中分配,当 Eden 区中没有足够的内存空间进行分配时,虚拟机将发起一次 minor GC {minor gc:发生在新生代的垃圾收集动 作,非常频繁,一般回收速度也比较快 full gc:发生在老年代的 gc} 一般情况下,新创建的对象都会被分配到Eden区(一些大对象特殊处理),这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区。对象在Survivor区中每熬过一次Minor GC,年龄就会增加1岁,当它的年龄增加到一定程度时,就会被移动到年老代中。 2)大对象直接进入老 年代 3)长期存活的对象将进入老年代

你可能感兴趣的:(Java,Java,垃圾回收,GC)