Atitit.常用的gc算法
Atitit.常用的gc算法
1.1. 记-清除算法
最基础的收集算法,算法分为标记和清除两个阶段:首先标记处所有要回收的对象,在标记完成之后统一回收所有被标记的对象。它最大的不足是效率不高,还会产生大量不连续的内存碎片
1.2. 复制算法
复制算法是为了解决效率问题而生的,它可以将可用内存容量划分为大小相等的两块,,每次只使用其中一块,当这一块内存用完了,就将还存活的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。这样每次会对整个半区进行GC,并且不会产生内存碎片等问题
现在的商业虚拟机大多采用这种算法来回收新生代,另外划分内存比例也不是1:1,像HotSpot默认Eden(一块Eden区)和Survivor(两块Survivor区)的大小比例为8:1,每次使用Eden和其中一块Surviovr区,也就是新生代中可用内存空间是整个新生代的90%,当回收时,将Eden和其中一块Survivor中还存活的对象一次性复制到另一块Survivor中,最后清理掉Eden和刚才用到的Survivor空间,细心的读者在这地方也许会有发现,如果复制过程那块没使用的Survivor不够用怎么办呢?这时候需要依赖老年代进行分配担保,担保成功就会将Eden和其中一块Survivor中还存活的对象移动到老年代中,担保失败就不得不在老年代触发一次垃圾回收。这地方延伸一下,新生代垃圾回收称为Minor GC,因为Java对象大多朝生夕死的特性,所以Minor GC很频繁,一般回收速度也快,而老年代垃圾回收称为Major GC/Full GC,Major GC的速度一般会比Minor GC的速度慢很多,从前面的分析过程我们可以轻易的推断,出现了Major GC,经常会伴随着一次Minor GC,但非绝对,因此我们GC的目的其实也是通过调优尽量控制减少Major GC的频率。这地方对应的垃圾收集器是Serial收集器、ParNew收集器(Serial收集器多线程版本,可与后面谈到的老年代收集器CMS进行配合工作)、Parallel Scavenge收集器。
作者:: ★(attilax)>>> 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙, EMAIL:1466519819@qq.com
转载请注明来源: http://www.cnblogs.com/attilax/
1.3. 标记-整理算法
这个算法是应用在老年代垃圾回收的算法,因为老年代不像复制算法那样回收频率高,另外它还会浪费空间。标记-整理过程与标记-清除差不多,无非后续步骤不是直接对可回收对象进行清除,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。这地方对应的垃圾收集器是Serial Old收集器、Parallel Old收集器。
1.4. 分代收集算法
当前商业虚拟机都采用这种算法,它的思想就是我们前面提到的对堆内存区域进行分代,新生代和老年代,不同的区域采用不同垃圾收集算法。新生代用复制算法,老年代用标记-整理或标记-清除算法。
相关文章
- 一致 Hash 算法分析
- 常用图像处理算法()[通俗易懂]
- Java数组常用算法
- 五大常用算法之三:贪心算法[通俗易懂]
- 每日算法刷题Day4-完全数、分情况输出、平方矩阵、斐波那契数列匹配输出
- 各种常用排序算法(C/C++,Java)动态显示
- 数据结构面试常见问题总结怎么写_前端数据结构与算法面试题
- 递归算法–斐波那契数列「建议收藏」
- 【工具类】雪花算法生成id
- 《算法设计与分析》期末不挂科的原因_算法设计与分析重点
- 联邦元学习算法Per-FedAvg的PyTorch实现
- JavaScript常用基础算法「建议收藏」
- C/C++语言常用排序算法
- 在字符串中找出连续最长的数字串(算法)
- 八种常用激光雷达和视觉SLAM算法的评估与比较
- C/C++ 常用加解密算法收集
- 【计算理论】计算复杂性 ( 算法复杂度标记 | 渐进上界 | 大 O 记号 | 常用的渐进上界 )
- 【干货书】Python强化学习算法:学习、理解和开发智能算法以应对人工智能挑战
- 电梯到底是什么调度算法?每次都要等半天!
- 创新!京东T7开创“新算法宝典”,图文并茂,全新演绎,太酷了
- 与异或操作相关的简单算法题
- 常用排序算法的时间和空间复杂度及算法时间复杂度的简单计算详解程序员
- asp下几种常用排序算法
- 浅析STL中的常用算法
- Javascript实现的常用算法(如冒泡、快速、鸽巢、奇偶等)