所谓复制算法(Copying),即将内存平均分成A区、B区两块,进行复制+清除垃圾的操作,算法图解如下:

算法过程:

  1. 新生对象被分配到A块中未使用的内存当中。当A块的内存用完了, 把A块的存活对象复制到B块。
  2. 清理A块所有对象。
  3. 新生对象被分配到B块中未使用的内存当中。当B块的内存用完了, 把B块的存活对象复制到A块。
  4. 清理B块所有对象。
  5. 循环1。

这种算法简单高效,但是内存代价极高,有效内存只为总内存的一半,会浪费掉50%的空间。所以这种算法只是纸面算法,不具备可用性,一般来说都会使用优化的复制算法。

这种方法不涉及到对象的删除,只是把可用的对象从一个地方拷贝到另一个地方,因此适合大量对象回收的场景,比如新生代的回收。

1.为什么会有年轻代

我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能。你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用,这样就会对堆的所有区域进行扫描。而我们的很多对象都是朝生夕死的,如果分代的话,我们把新创建的对象放到某一地方,当GC的时候先把这块存“朝生夕死”对象的区域进行回收,这样就会腾出很大的空间出来。

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

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

(1)在GC开始的时候,对象只会存在于Eden区和名为“From”的Survivor区,Survivor区“To”是空的。

(2)紧接着进行GC,Eden区中所有存活的对象都会被复制到“To”

(3)而在“From”区中,仍存活的对象会根据他们的年龄值来决定去向(对象在From区中每熬过一次Minor GC,年龄就会增加1岁)。年龄达到一定值(年龄阈值,可以通过-XX:MaxTenuringThreshold来设置)的对象会被移动到年老代中,没有达到阈值的对象会被复制到“To”区域。

(4)经过这次GC后,Eden区和From区已经被清空。这个时候,“From”和“To”会交换他们的角色,也就是新的“To”就是上次GC前的“From”,新的“From”就是上次GC前的“To”。不管怎样,都会保证名为To的Survivor区域是空的。Minor GC会一直重复这样的过程,直到“To”区被填满,“To”区被填满之后,会将所有对象移动到年老代中。

可以理解成这样:

算法过程:

  1. Eden+S0(From Survivor区)可分配新生对象;
  2. 对Eden+S0(From Survivor区)进行垃圾收集,Eden存活对象复制到S1(To Survivor区),From Survivor区仍然存活的对象,根据他们的年龄决定去向,年龄达到阈值的去年老代中,未达到阈值的去To Survivor区,此时Eden+S0(From Survivor区)相当于是被清空了,对象都被移到了其他区,该回收的也被回收了。一次新生代GC结束。
  3. From Survivor区和To Survivor区交换,Eden+S1(此时的S1相当于From Survivor区)可分配新生对象;
  4. 对Eden+S1进行垃圾收集,存活对象复制到S0(此时的S0相当于To Survivor区)。清理Eden+S1(From Survivor区)。二次新生代GC结束。
  5. 循环1。

Copying复制算法相关推荐

  1. 深入理解Java虚拟机——复制(Copying)算法

    目录 一.复制算法的概述 二.复制算法的优点 三.复制算法的缺点 四.复制算法的执行过程 一.复制算法的概述 复制(Copying)算法将可用内存被容量划分为大小相等的两块,每次只使用其中的一块.当这 ...

  2. 26 Java GC算法 垃圾收集器、标记 -清除算法、复制算法、标记-压缩算法、分代收集算法

    26.Java GC算法 垃圾收集器 1.1.1标记 -清除算法 1.1.2复制算法 1.1.3标记-压缩算法 1.1.4分代收集算法 26.Java GC算法 垃圾收集器 概述 垃圾收集 Garba ...

  3. c语言代码大全复制,垃圾回收算法实现之 - 复制算法(完整可运行C语言代码)...

    GC 复制算法(Copying GC)是 Marvin L. Minsky 在 1963 年研究出来的算法.说得简单点,就是只把某个空间里的活动对象复制到其他空间,把原空间里的所有对象都回收掉.这是一 ...

  4. 垃圾回收算法——复制算法 以及eden和survivor

    复制(Copying)算法说到底也是为了解决标记-清除算法产生的那些碎片. 首先将内存分为大小相等的两部分(假设A.B两部分),每次呢只使用其中的一部分(这里我们假设为A区),等这部分用完了,这时候就 ...

  5. Java千百问_07JVM架构(009)_什么是新生代的复制算法

    点击进入_更多_Java千百问 1.什么是新生代的复制算法 了解堆内存看这里:java堆内存是什么样的 了解java垃圾回收看这里:java垃圾回收机制是什么 所谓复制算法(Copying),即将内存 ...

  6. JVM 垃圾回收之复制算法

    一 背景 为了解决标记-清除算法在垃圾收集效率方面的缺陷,M.L.Minsky 于1963 年发表了著名的论文,"使用双存储区的 Lisp 语言垃圾收集器 CA LISP Garbage C ...

  7. 【Java 虚拟机原理】垃圾回收算法 ( 标记-清除算法 | 复制算法 | 标记-整理算法 )

    文章目录 总结 一.标记-清除算法 二.复制算法 三.标记-整理算法 总结 常用的垃圾回收算法 : 标记-清除算法 ; 复制算法 ; 标记-整理算法 ; 这些算法没有好坏优劣之分 , 都有各自的 优势 ...

  8. 【Android 内存优化】垃圾回收算法 ( 内存优化总结 | 常见的内存泄漏场景 | GC 算法 | 标记清除算法 | 复制算法 | 标记压缩算法 )

    文章目录 一. 内存优化总结 二. 常见的内存泄漏场景 三. 内存回收算法 四. 标记-清除算法 ( mark-sweep ) 五. 复制算法 六. 标记-压缩算法 一. 内存优化总结 内存泄漏原理 ...

  9. 2、垃圾回收算法(标记清除算法、复制算法、标记整理算法和分代收集算法),各种垃圾收集器讲解(学习笔记)

    2.垃圾回收概述 2.1.垃圾回收算法 2.1.1.垃圾回收算法-标记清除算法 2.1.2.垃圾回收算法–复制算法 2.1.3.垃圾回收算法–标记整理算法和分代收集算法 2.1.4.垃圾回收算法–Se ...

最新文章

  1. Python每日一练0023
  2. python代码统计字符串中大写字符、小写字符、特殊字符以及数值字符出现的次数
  3. 初级算法——两个物种(蓝桥杯)
  4. PYTHON3 函数定义
  5. cmd如何刷新MySQL数据库_怎样在cmd中用命令操作MySQL数据库 需要技巧
  6. 主流微服务注册中心浅析和对比
  7. python 子线程返回值_python-从线程返回值
  8. 删除和创建用户的脚本
  9. inner join 与 left join 之间的区别
  10. Windows Azure Azure 简介
  11. 【安装记录】Centos7.6下载安装配置教程(十分详细)
  12. android viewflipper图片轮播,ViewFlipper探索与使用——顺便实现Android图片轮播
  13. python风变编程是骗局吗-如何看待风变编程的 Python 网课?
  14. 悦保车牌识别相机优势
  15. Andriod1.0无法被识别,更新为安卓 ADB 驱动
  16. 郑州计算机五年大专学校排名,2021年河南十大专科学校排名 河南最好的高职院校...
  17. 【asp.net】MVC中cshtml页面Razor语法大全(综合实例)
  18. 丑哥哥工作室官方网站开通啦
  19. u-boot for tiny210 ver2.2(by liukun321咕唧咕唧)
  20. (附源码)springboot球鞋文化交流论坛 毕业设计 141436

热门文章

  1. 15-VMware Horizon 2203 虚拟桌面-Win10 自动桌面池完整克隆浮动(十五)
  2. 2023年中国博士后科学基金资助指南发布
  3. java.lang.RuntimeException: Duplicate class com.bumptech.glide.GeneratedAppGlideModuleImpl found in
  4. 击剑,格斗中的“古典芭蕾”
  5. 斯坦福学长带你深入了解人工智能
  6. MySQL分表后的ID怎么保证唯一性,非sharding_key查询怎么处理
  7. LaTeX Algorithm相关写法
  8. mysql varchar 默认长度_MySQL VARCHAR类型字段到底可以定义多长
  9. FPGA基于GS2971/GS2972实现SDI视频收发 提供工程源码和技术支持
  10. js实现groupby数组分组