在介绍"平平无奇"的标记清除算法时, 还留下了另一个问题, 就是内存碎片的问题.

内存碎片的问题是指, 每次回收的内存都是比较分散的, 可以加起来是一个比较大的数值, 但是由于可用内存都不连续, 没有办法分配给需要内存较多的新对象, 因此导致这些内存被浪费掉.或许聪明的你会有这样的一个问题: 如果我的内存空间特别大, 每次回收对象都很多, 即使回收空间很碎, 也还好吧?

对这个问题的回答是, 碎片始终是带来的利用率的下降, 并且也带来了管理上的成本(指针会多很多).

另外, 在回答这个问题之后, 还有一点要强调一下, 就是GC机制是一个平民机制, 土豪同学其实可以不用学这个. 因为假设你足够豪也足够土, 你可以购置一个超级大的内存, 然后让你的JAVA进程欢快的在上面申请个几百年也不用担心内存被用满的情况.

其实解决内存碎片的手段很简单, 就是把他们重新整理一下, 整个标记整理算法的过程是这样的:标记: 先按照根搜索算法进行遍历, 对于遍历到的对象进行标记, 直到遍历结束.

整理: 在遍历结束后, 对于标记过的对象, 把它们从内存开始的区域按顺序依次摆好, 整整齐齐的, 中间没有任何的缝隙. 在摆放完最后一个标记过的对象后, 把之后的内存区域直接回收掉. (这里最耗时的步骤是, 当你移动一个对象的内存位置时, 你需要让所有之前依赖这个对象的对象更新一下引用地址信息, 这样才不会在移动之后出错.)为什么非要等到标记全部结束才开始整理, 为什么不一边标记一边整理?

原因在于对象的遍历过程和内存的摆放顺序不是一致的, 很可能一个对象摆放在内存的前面部分, 但是需要等到最后的时候才能遍历到这个对象, 因此, 如果提前开始整理, 会影响到这个对象.

标记整理算法解决了内存碎片的问题, 但是也带来一个问题, 就是效率比原来的标记清除算法要低, 主要的原因在于需要在标记结束之后, 整理所有存活对象的引用地址.

下回介绍: 聊聊JAVA GC系列(8) - 复制算法

java整段标记_聊聊JAVA GC系列(7) - 标记整理算法相关推荐

  1. java中字节码_聊聊Java的字节码

    本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 巴山楚水凄凉地,二十三年弃置身. 怀旧空吟闻笛赋,到乡翻似烂柯人. 沉舟侧畔千帆过,病树前头万 ...

  2. java简单对称加密_聊聊java中的对称加密机制

    对数据的加密算是一个老生常谈的话题了,加密的方式很多,java也为这些加密算法提供了支持.今天就来聊聊对称加密算法的java实现方式.本文对加密算法不了解也没关系,我会从0开始讲解,保证小白也能看懂. ...

  3. java string hash变量_聊聊 Java 中 HashMap 初始化的另一种方式

    如果你接触过不同的语言,从语法和代码层面来说,Java 是一种不折不扣的"臃肿.啰嗦"的语言,从另一方面来说这种臃肿和啰嗦也体现了它严谨的一面,作为适合构建大型.复杂项目的理由之一 ...

  4. java项目----教务管理系统_基于Java的教务管理系统

    java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...

  5. java gc机制 优点_聊聊Java的GC机制

    作者 某人Valar 如需转载请保留原文链接 部分图片来自百度,如有侵权请联系删除 本文目录 什么是GC JVM内存结构简单介绍 可达性分析与GC Roots 常见的垃圾收集算法 1. 什么是GC G ...

  6. java 获取泛型_聊聊Java泛型擦除那些事

    >版权申明]非商业目的注明出处可自由转载 博文地址:https://blog.csdn.net/ShuSheng0007/article/details/89789849 出自:shushen ...

  7. java final 内存_聊聊 Java 内存模型

    原标题:聊聊 Java 内存模型 *作者:青芒@有赞 本文目录 Java内存模型 重排序 内存屏障 volatitle的内存语义 final的内存语义 一.Java内存模型 硬件处理 电脑硬件,我们知 ...

  8. JAVA解决实例问题_解决java方法

    没有R.java问题找不到getActionBar()方法 android项目,可是项目中没有重要的R.java,并且报错,说是找不到getActionBar()方法,上网寻找原因,终于寻得解决方法: ...

  9. java cms 垃圾回收_了解Java垃圾自动回收

    引用计数算法简单的说就是在给对象添加一个引用计数器,每次被引用则该计数器加1,当引用失效时,计数器减1,计数器值为0的表示该对象不再被使用. 该算法被Python等许多脚本语言采用来管理内存,但jav ...

最新文章

  1. Oracle数据库备份与恢复1\Oracle数据库备份与恢复(1)exp和imp 之三
  2. 西安网络推广教大家如何正确解决处理网站死链
  3. springboot 定时任务schedule
  4. [SQL] 函数整理(T-SQL 版)
  5. 【编译原理】文法的基本概念
  6. C语言开发笔记(五)字符串常量
  7. 前端学习(526):等分布局
  8. python删除txt指定内容_python删除文件中指定内容
  9. SDUT-2054_数据结构实验之链表九:双向链表
  10. Android AsyncTask源代码浅析
  11. 什么专业越老越吃香?
  12. Hive-003安装配置
  13. HTML在线颜色选择器源码
  14. 基于树莓派语音合成小白避坑
  15. 服务器生成微信sign,签名生成方法
  16. C语言itoa()函数
  17. 4.18、TCP滑动窗口
  18. MATLAB中内置的BP神经网络函数 help newff翻译【学习笔记】
  19. Linux下查看某一进程占用的内存
  20. unity游戏开发-socket网络通信

热门文章

  1. python 打包文件夹_Python打包文件夹(zip/tar/
  2. uniapp苹果底部栏自适应配置
  3. 微信小程序 获取input输入的值
  4. java freemarker_Java: FreeMarker的配置和使用
  5. 用python玩转数据测试与作业_大学mooc用Python玩转数据章节测试答案
  6. ++代码实现 感知机的原理_决策树ID3原理及R语言python代码实现(西瓜书)
  7. 相邻省份最多的省区_拉萨万达广场开业 实现中国大陆省份全覆盖
  8. java sql 写入万条数据_如何快速向数据库插1000万数据?4种方法对比,它简单却速度最快
  9. java exe 路径_Java程序获取执行自己的java.exe路径
  10. java面向对象上机题库_Java面向对象编程上机-练习题汇总