java整段标记_聊聊JAVA GC系列(7) - 标记整理算法
在介绍"平平无奇"的标记清除算法时, 还留下了另一个问题, 就是内存碎片的问题.
内存碎片的问题是指, 每次回收的内存都是比较分散的, 可以加起来是一个比较大的数值, 但是由于可用内存都不连续, 没有办法分配给需要内存较多的新对象, 因此导致这些内存被浪费掉.或许聪明的你会有这样的一个问题: 如果我的内存空间特别大, 每次回收对象都很多, 即使回收空间很碎, 也还好吧?
对这个问题的回答是, 碎片始终是带来的利用率的下降, 并且也带来了管理上的成本(指针会多很多).
另外, 在回答这个问题之后, 还有一点要强调一下, 就是GC机制是一个平民机制, 土豪同学其实可以不用学这个. 因为假设你足够豪也足够土, 你可以购置一个超级大的内存, 然后让你的JAVA进程欢快的在上面申请个几百年也不用担心内存被用满的情况.
其实解决内存碎片的手段很简单, 就是把他们重新整理一下, 整个标记整理算法的过程是这样的:标记: 先按照根搜索算法进行遍历, 对于遍历到的对象进行标记, 直到遍历结束.
整理: 在遍历结束后, 对于标记过的对象, 把它们从内存开始的区域按顺序依次摆好, 整整齐齐的, 中间没有任何的缝隙. 在摆放完最后一个标记过的对象后, 把之后的内存区域直接回收掉. (这里最耗时的步骤是, 当你移动一个对象的内存位置时, 你需要让所有之前依赖这个对象的对象更新一下引用地址信息, 这样才不会在移动之后出错.)为什么非要等到标记全部结束才开始整理, 为什么不一边标记一边整理?
原因在于对象的遍历过程和内存的摆放顺序不是一致的, 很可能一个对象摆放在内存的前面部分, 但是需要等到最后的时候才能遍历到这个对象, 因此, 如果提前开始整理, 会影响到这个对象.
标记整理算法解决了内存碎片的问题, 但是也带来一个问题, 就是效率比原来的标记清除算法要低, 主要的原因在于需要在标记结束之后, 整理所有存活对象的引用地址.
下回介绍: 聊聊JAVA GC系列(8) - 复制算法
java整段标记_聊聊JAVA GC系列(7) - 标记整理算法相关推荐
- java中字节码_聊聊Java的字节码
本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 巴山楚水凄凉地,二十三年弃置身. 怀旧空吟闻笛赋,到乡翻似烂柯人. 沉舟侧畔千帆过,病树前头万 ...
- java简单对称加密_聊聊java中的对称加密机制
对数据的加密算是一个老生常谈的话题了,加密的方式很多,java也为这些加密算法提供了支持.今天就来聊聊对称加密算法的java实现方式.本文对加密算法不了解也没关系,我会从0开始讲解,保证小白也能看懂. ...
- java string hash变量_聊聊 Java 中 HashMap 初始化的另一种方式
如果你接触过不同的语言,从语法和代码层面来说,Java 是一种不折不扣的"臃肿.啰嗦"的语言,从另一方面来说这种臃肿和啰嗦也体现了它严谨的一面,作为适合构建大型.复杂项目的理由之一 ...
- java项目----教务管理系统_基于Java的教务管理系统
java项目----教务管理系统_基于Java的教务管理系统 2022-04-22 18:18·java基础 最近为客户开发了一套学校用教务管理系统,主要实现学生.课程.老师.选课等相关的信息化管理功 ...
- java gc机制 优点_聊聊Java的GC机制
作者 某人Valar 如需转载请保留原文链接 部分图片来自百度,如有侵权请联系删除 本文目录 什么是GC JVM内存结构简单介绍 可达性分析与GC Roots 常见的垃圾收集算法 1. 什么是GC G ...
- java 获取泛型_聊聊Java泛型擦除那些事
>版权申明]非商业目的注明出处可自由转载 博文地址:https://blog.csdn.net/ShuSheng0007/article/details/89789849 出自:shushen ...
- java final 内存_聊聊 Java 内存模型
原标题:聊聊 Java 内存模型 *作者:青芒@有赞 本文目录 Java内存模型 重排序 内存屏障 volatitle的内存语义 final的内存语义 一.Java内存模型 硬件处理 电脑硬件,我们知 ...
- JAVA解决实例问题_解决java方法
没有R.java问题找不到getActionBar()方法 android项目,可是项目中没有重要的R.java,并且报错,说是找不到getActionBar()方法,上网寻找原因,终于寻得解决方法: ...
- java cms 垃圾回收_了解Java垃圾自动回收
引用计数算法简单的说就是在给对象添加一个引用计数器,每次被引用则该计数器加1,当引用失效时,计数器减1,计数器值为0的表示该对象不再被使用. 该算法被Python等许多脚本语言采用来管理内存,但jav ...
最新文章
- Oracle数据库备份与恢复1\Oracle数据库备份与恢复(1)exp和imp 之三
- 西安网络推广教大家如何正确解决处理网站死链
- springboot 定时任务schedule
- [SQL] 函数整理(T-SQL 版)
- 【编译原理】文法的基本概念
- C语言开发笔记(五)字符串常量
- 前端学习(526):等分布局
- python删除txt指定内容_python删除文件中指定内容
- SDUT-2054_数据结构实验之链表九:双向链表
- Android AsyncTask源代码浅析
- 什么专业越老越吃香?
- Hive-003安装配置
- HTML在线颜色选择器源码
- 基于树莓派语音合成小白避坑
- 服务器生成微信sign,签名生成方法
- C语言itoa()函数
- 4.18、TCP滑动窗口
- MATLAB中内置的BP神经网络函数 help newff翻译【学习笔记】
- Linux下查看某一进程占用的内存
- unity游戏开发-socket网络通信
热门文章
- python 打包文件夹_Python打包文件夹(zip/tar/
- uniapp苹果底部栏自适应配置
- 微信小程序 获取input输入的值
- java freemarker_Java: FreeMarker的配置和使用
- 用python玩转数据测试与作业_大学mooc用Python玩转数据章节测试答案
- ++代码实现 感知机的原理_决策树ID3原理及R语言python代码实现(西瓜书)
- 相邻省份最多的省区_拉萨万达广场开业 实现中国大陆省份全覆盖
- java sql 写入万条数据_如何快速向数据库插1000万数据?4种方法对比,它简单却速度最快
- java exe 路径_Java程序获取执行自己的java.exe路径
- java面向对象上机题库_Java面向对象编程上机-练习题汇总