简单描述垃圾回收算法

1. 标记清除算法:

分为两个阶段,标记阶段与清除阶段,标记阶段是标记出需要回收的对象。清除阶段是回收被标记对象的内存空间。

优点是原理简单,实现方便。

缺点是容易造成内存碎片,效率低下。碎片太多就会导致后面为大对象分配内存空间时,无法找到内存连续的空间,从而导致触发新的垃圾回收。

 

2. 复制算法

为了解决标记清楚算法的碎片过多问题。复制算法将空间分为两个大小相等的块。每次只使用一块。当一块内存使用完后,将就存活的对象复制到另一块,再将已经使用的内存空间清除掉。这样解决了碎片多的问题。

在堆中年轻代使用该算法,因为年轻代对象多为生存周期比较短的对象。年轻代将内存分为一个较大 Eden ,两个较小 survivor 。(8:1:1)每次使用 1 个 Eden ,1 个 survivor。当回收时,将 Eden 和 survivor 存活的对象复制到另一个 survivor 中。最后清理掉 Eden 和 survivor 。当 Eden 和 survivor 存活的对象超过另一个 survivor 时,需要老年代来担保。

优点:运行高效,解决了碎片多的问题。

缺点:内存使用只有原来的一半。内存浪费。

 

3. 标记整理算法

复制算法在对象存活率较高,效率较低。第一阶段标记与标记清楚算法一模一样。标记完成之后,不是清理对象。而是把存活对象移动到一端,然后再清理掉边界外的内存。

优点:解决了碎片问题,内存没有浪费

缺点:成本更高,对象进行了移动。

 

4. 分代收集算法

是目前大部分 JVM 垃圾回收器采用的算法。根据对象的生命周期,将堆内存分为老年代和新生代。堆外还有一个永久代。老年代每次垃圾回收只有少量对象被回收,新生代有大量对象被回收。可以根据特点采用不同垃圾回收算法。

大多数 JVM 对新生代是采用复制算法。因为新生代大量对象会被回收,所以复制的就少。

老年代则是使用标记整理算法。

 

新生代的回收算法:

1. 所有新对象都是年轻代的,年轻代的目的是尽可能快速收集掉生命周期短的对象。

2. 大部分对象都是在 Eden 上生成,回收时先将 Eden 存活的对象复制到 survivor 0 中,然后清空 Eden ,当 survivor 0 也放满之后,将 Eden 和 survivor 0 存活的对象复制到 survivor 1 中,然后清空 Eden 和 survivor 0 ,此时 survivor 0 是空的,然后 survivor 0 与 survivor 1 交换。(为什么要 survivor 1 为空,是为了让 Eden 和 survivor 0 交换存活对象。)如此往复,当 Eden 没有足够的空间时,会触发 JVM 发起一次 MinorGC。

3. 当 survivor 1 没有足够内存存放survivor 0 与 Eden 的存活对象时,就将存活对象放进老年代,老年代如果满了,就触发 FullGC,新生代和老年代一起回收。

4. 新生代的 GC 就是 MinorGC ,MinorGC 的频率较高,不一定等 Eden 满了之后才会触发。

 

老年代的回收算法:

年轻代经历了 N 次垃圾回收依然存活的对象,就会被放到老年代。里面存放的是生命周期较长的对象。

内存比新生代大,老年代的 GC 叫做 FullGC 。

 

永久代的回收算法:

 也叫方法区。用于存放静态方法,方法区回收的内容有废弃的常量、无用的类。废弃常量可以使用引用可达性判断,无用的类需要满足以下三个条件:

  1. 该类所有实例被回收。
  2. 加载该类的 classloader 已经被回收。
  3. 无法在任何地方通过反射访问该类的方法。

 

新生代与老年代的区别:

新生代与老年代根据分代收集算法定义的,年轻代有 Eden 与 survivor 区,加上老年代一共三个区。数据首先进入 Eden 区(如果是大对象直接进入老年代,大对象是指需要连续大量内存的 Java 对象),如果 Eden 区满了,触发 JVM 发起 minorGC ,如果对象经历一次  survivor 还存活,并且又能被 survivor 区接受,那移动到 survivor 区,年龄 设为1 ,对象每在 survivor 区经过一次 minorGC ,年龄+1,年龄达到一定程度(默认15),就晋升老年代。老年代满了就执行 FullGC ,FullGC 不常执行,所以采用了标记整理算法。

 

 

 

 

 

转载于:https://my.oschina.net/u/3973793/blog/3097265

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值