专栏首页国产程序员垃圾回收算法(4)-复制算法

垃圾回收算法(4)-复制算法

算法原理

复制算法首先将或者的内存空间分为2块,每次只使用其中一块,在垃圾会搜时将正在使用的内存中的存活对象复 制到未被使用的内存块中,之后清楚正在使用的内存块中的所有对象,交换2个内存的角色,最后完成垃圾回收。

image

年轻代中的GC

HotSpot JVM把年轻代分为了三部分:1个Eden区和2个Survivor区(分别叫fromto)。默认比例为8:1,为啥默认会是这个比例,接下来我们会聊到。一般情况下,新创建的对象都会被分配到Eden区(一些大对象特殊处理),这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区。对象在Survivor区中每熬过一次Minor GC,年龄就会增加1岁,当它的年龄增加到一定程度时,就会被移动到年老代中。

因为年轻代中的对象基本都是朝生夕死的(80%以上),所以在年轻代的垃圾回收算法使用的是复制算法,复制算法的基本思想就是将内存分为两块,每次只用其中一块,当这一块内存用完,就将还活着的对象复制到另外一块上面。复制算法不会产生内存碎片。

GC开始的时候,对象只会存在于Eden区和名为“From”的Survivor区Survivor区“To”是空的。紧接着进行GCEden区中所有存活的对象都会被复制到“To”,而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。经过这次GC后,Eden区From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,会将所有对象移动到年老代中。

image

存在问题

由于JVM中的绝大多数对象都是瞬时状态的,生命周期非常短暂,所以复制算法被广泛应用于年轻代中。分区、复制的思路不仅大幅提升了垃圾回收的效率,而且也将原本复杂的内存分配算法变的前所未有的简明扼要(既然每次内存回收都是对整个半区空间的回收,内存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存就可以了)。 不过在垃圾收集技术中,复制算法提高效率的代价是认为的将可用内存缩小了一半。

个人博客

简书

掘金

CSDN

OSCHINA

本文分享自微信公众号 - 国产程序员(Monday_lida),作者:看似无限透明的你

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 垃圾回收算法(3)-标记清除算法

    标记清除算法(Mark-Sweep)是一种非常基础和常见的垃圾收集算法,该算法被J.McCarthy等人在1960年提出并成功的发明并应用于Lisp语言。

    一觉睡到小时候
  • CSS基础之选择器

    想对某个结构元素式样样式,但是想排除这个结构元素下面的子结构元素,让它不使用这个样式,可使用not选择器。

    一觉睡到小时候
  • 面向对象的7种设计原则(4)-合成/聚合复用原则

    在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用这些对象的目的。

    一觉睡到小时候
  • 2018-07-161 初识JQuery

    进入官方网站获取最新的版本 http://jquery.com/download/ ,这里需要注意 jQuery 分 2 个系列版本 1.x 与 2.x,主要...

    JavaEdge
  • jquery对象和javascript对象相互转换

    本文转载:http://jeiofw.blog.51cto.com/3319919/786506

    跟着阿笨一起玩NET
  • 前端基础-jQuery对象和DOM对象

    jQuery对象不能使用DOM对象的成员,DOM对象不能使用jQuery对象的成员

    cwl_java
  • Spring系列第2篇:控制反转(IoC)与依赖注入(DI),晦涩难懂么?

    Spring中有3个核心的概念:控制反转(Ioc)、依赖注入(DI)、面向切面编程(AOP),spring中其他的技术都是依靠3个核心的技术建立起来的,所以玩s...

    路人甲Java
  • JS对象与Dom对象与jQuery对象之间的区别

    通过问题看本质: 举例: js的写法:document.getElementById('save').disabled=true; 在jquery中我是这...

    用户1195962
  • 秒变莫扎特、贝多芬,Facebook提出完美转换音乐风格的神经网络

    新智元
  • 一文了解动态场景中的SLAM的研究现状

    常规的SLAM算法首先假设环境中所有物体均处于静止的状态。而一些能够在动态环境中运行的SLAM系统,只是将环境中的动态物体视为异常值并将他们从环境中剔除,再使用...

    小白学视觉

扫码关注云+社区

领取腾讯云代金券