JVM入门学习小计三

JVM入门学习

前文链接:JVM入门学习小计
前文链接:JVM入门学习小计二

GC垃圾回收算法

1.引用计数法

  • 对堆内的每个对象计上引用的次数(JVM基本不用)
    在这里插入图片描述
    对于使用次数为零的对象进行清除

2.复制算法

  • 复制算法是年轻代主要使用的算法,在了解该算法前,首先要了解幸存区的0区和1区,也就是from区和to区,两者是不是写死的,而是存在动态转换的;
  • 每次GC都会将Eden存活的对象移到幸存区,而区分from区和to区的最好方法是谁空谁为to,因为每次GC后,幸存的对象一般会存到to区;
  • 例如,第一次轻GC的时候,会将存活的对象存在幸存to区,然后to区和from区转换,也就是from区有了对象,to区没有了;第二次GC的时候,jvm会将幸存的对象存放在空的to区,同时会采用复制算法将from区的存活对象复制到to区,然后from区和to区再相互转换,则此时to区又为空了;
  • 好处: 没有内存的碎片;
  • 坏处 浪费了内存的空间,需要多开辟一块幸存区;极端情况下,假设对象存活率100%,则需要复制的对象太多;
  • 复制算法最佳使用算法:对象存活度较低的时候,也就是新生代,毕竟淘汰率贼高!

3.标记清除算法

  • 标记清除算法分两次扫描进行,第一次扫描对使用过的对象进行标记
  • 第二次扫描对未标记的对象进行清除,具体如下图:
    在这里插入图片描述
  • 优点:不需要额外的空间;
  • 缺点:两次扫描,严重浪费时间,会产生内存碎片;

4.标记压缩算法

  • 基于标记清除算法,为了去除内存碎片,出现了标记压缩算法。
  • 标记压缩算法某种意义上,是在标记清除算法上加以改动,新增一次扫描,向内存的一段移动存活的对象,依次消除内存碎片,如下图:
    在这里插入图片描述
  • 优点:去除了内存碎片;
  • 缺点:多了一次扫描,增加了时间成本;

5.标记清除压缩算法

  • 整合了标记清除算法和标记压缩算法,一般设定几次标记清除后进行标记压缩,降低时间成本;

6.总结

  1. 空间和时间的矛盾是一直都存在的,暂时无法做到两者都最优,只能采取折中做到相对最优;
  2. 内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度问题)
  3. 内存整理度:复制算法=标记压缩算法>标记清除算法
  4. 内存利用率:标记压缩算法=标记清除算法>复制算法
  5. 对于算法,没有最优,只有最合适,因此GC算法也被称为分代收集算法
  6. 年轻代:
    • 存活率低;
    • 复制算法;
  7. 老年代:
    1. 区域大:存活率大;
    2. 标记清除(内存碎片不多的时候)+标记压缩(内存碎片多的时候)混合实现;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值