虚拟机内的垃圾收集算法
我这只是介绍虚拟机内的垃圾收集算法大致介绍,因为每一种垃圾收集算法都涉及到大量的程序代码细节,而且各个平台的虚拟机操作内存的方法又各不一样,因此我这里就不对算法的实现做描述了;
1标记-清除算法
标记清除算法是最基础的算法,如名一样,分为 “标记 ”和 “清除”两个阶段,首先是标记哪些对象是需要清除的,哪些对象是需要清除的也就是不可能被任何途径使用的对象也称为“死对象”,标记完之后再统一回收被标记的所有对象,这种算法存在两个问题:一是效率问题,标记和清除两个过程的效率都不高,二是空间问题,被清除的对象会留下大量不连续的空间碎片,空间碎片太多可能会导致后续程序运行过程中需要分配较大内存的时候,找不到足够大连续的内存而触发再一次的垃圾收集动作;
2复制算法
标记清除算法效率不高,为了解决效率问题,复制算法出现了,它将可用内存分为大小相等的两块,虽然有两块但是它就只用一块,当这一块内存用完了,它再将还存活的对象的对象复制到另外一块上,然后再将用过的那一半内存空间一次情掉,这样每次都是对整个半区清理,内存分配的时候也就不用考虑空间碎片的问题;
3标记-整理算法
复制算法不知道大家有没有注意到,当一半内存存活数量很高的时候会做大量的复制操作,这样效率还是不够高,之后又有人提出另外的一种算法,标记整理算法,和标记清除算法一样,只是标记整理算法有后续的操作,就是对可回收对象进行整理,还存活的对象一边移,然后清理边界以外的内存
4分代收集算法
当前商业虚拟机的垃圾收集算法都采用的是分代收集算法,这种算法并没有什么心的思路,只是根据对象存活的周期不同将内存划分为几块,一般是把java堆分为新生代和老生代,这样就可以根据各个年代的特点对才用最适当的算法,在新生代中每次垃圾收集时都会有大量的对象死去只有少量存活就才用复制算法,而老年代中,因为对象存货率高,没有额外的空间对它们进行分配担保,就必须才用标记清理或者标记整理算法来进行回收;
- R分词继续,"不|知道|你在|说|什么"分词添加新词
- Java开发Spring第一天
- 关于R安装中文分词包安装不上的问题install.packages("tm")
- dataguard备库的数据文件的迁移实战(r8笔记第24天)
- Hive的left join、left outer join和left semi join三者的区别
- 52. Socket Server 自定义协议的简单实现 | 厚土Go学习笔记
- dataguard备库的数据文件的迁移(r8笔记第22天)
- 46. 实现一个简单的网络爬虫 | 厚土Go学习笔记
- 45. sync.Mutex 互斥和互斥锁 | 厚土Go学习笔记
- golang进度条
- 44. goroutine、channel、time的例子 | 厚土Go学习笔记
- AVL二叉树
- Golang:使用 httprouter 构建 API 服务器
- dataguard中需要注意的一些数据文件操作(r8笔记第21天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python五十八课——正则表达式(切割)
- python五十九课——正则表达式的拓展内容
- 配置SVN的hooks功能自动更新代码
- python六十课——高阶函数之map
- python六十一课——高阶函数之reduce
- python六十二课——高阶函数之filter
- Nginx优化配置详解
- python六十三课——高阶函数之sorted
- python六十四课——高阶函数练习题(一)
- python六十四课——高阶函数练习题(二)
- python六十四课——高阶函数练习题(三)
- Jenkins+Maven+Svn实现代码自动打包与发布
- python六十五课——单元测试(一)
- python六十六课——单元测试(二)
- Linux企业生产常见问题集合(一)答案