垃圾回收算法

现在主要的垃圾回收算法主要有四种垃圾算法

1.标记-清除算法

这个垃圾回收算法就是回收的时候只对标记出来已经没有用的对象进行回首之后回收之后并不执行任何操作,这个垃圾回收算法大家可以看出来有一个很大的问题就是会产生大量的内存碎片。在这里插入图片描述

2.复制算法

复制算法的核心就是实现把内存分为两块区域,每次分配内存空间的时候只是从其中的一块分配,另一块还是空闲的,垃圾回收之后把还处于存活状态的对象直接复制到另一块空闲的区域内。这样就避免了内存碎片的产生。但是这样也有一个问题就是使用的内存空间不是全部的空间,第二就是必须保证GC之后空闲的区域有足够的空间给仍处于存活状态的对象使用。
在这里插入图片描述

3.标记-整理算法

这个算法跟第一个标记-清除算法最主要的区别就是清楚之后还会对存活的对象进行一次整理,把存活的对象都整理到一起。这样也防止了内存碎片的出现。但是因为有整理的时间,所以他的效率没有标记-清除算法效率高。但是如果遇到比较大的对象需要分配内存空间的时候,它就会有充足的连续内存对大的对象分配内存。
在这里插入图片描述

4.分代回收算法

这也是现在大部分垃圾回收器采取的算法。它把垃圾回收的区域分为新生代和年老代两个区域。这两个区域的大小都是可以在程序启动的时候使用参数来指定的。不同的垃圾回收器也会有它自己的默认值。年轻代主要采用的GC算法就是复制算法。
因为年轻代的对象好多都是朝生夕死,一次GC下来之后存活的对象就不多了。所以它对新生代的设计是两个survivor区和一个Eden区,每次新创建的对象都使用Eden区。发生一次新生代GC之后就把仍然存活的对象全部复制到另一个survivor区域。并且eden区清除。之后分配对象就是继续使用eden区,然后下次GC的时候就需要清除Eden区和上次那个存活对象的survivor区,并且把仍然存活的对象移到空闲的survivor区。这样以后每次GC都会清除eden区和其中的一个survivor区。
年老代使用的算法就是标记-清除法或者标记-整理法。因为年老代的对象生存周期比较长。

5.方法区的回收

注意JVM规范并没有要求对方法区进行回收,因为对年轻代的一次回收可以回收80%左右的空间,但是方法区的回收效率很低。
方法区主要可以回收的有两类

  • 无用的常量
  • 无用的类

无用的常量判断起来很简单,但是无用的类判断起来就很麻烦。必须满足下面三点,这个类才可以被回收。

  1. 当前类已经没有实例对象存在
  2. 当前类的类加载器已经被回收
  3. 程序里面没有这个类的class类
    虽然JVM规范没有要求清理方法区,但是如果我们的程序里面有使用到了大量的动态代理,CGLIB代理或者生成大量的JSP的时候我们就应该考虑对方法区的回收了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值