开发者社区> 小威要向诸佬学习呀> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

复制算法

简介: 复制算法
+关注继续查看

标记–整理算法优点:

解决标记清除算法出现的内存碎片问题,
标记–整理算法缺点:

压缩阶段,由于移动了可用对象,需要去更新引用。
标记–整理算法应用场景:

该算法一般应用于老年代,因为老年代的对象生命周期比较长。

4.5.4 复制算法
该算法将内存平均分成两部分,然后每次只使用其中的一部分,当这部分内存满的时候,将内存中所有存活的对象复制到另一个内存中,然后将之前的内存清空,只使用这部分内存,循环下去。

这个算法与标记-整理算法的区别在于,该算法不是在同一个区域复制,而是将所有存活的对象复制到另一个区域内。

复制算法的优点:

在存活对象不多的情况下,性能高,能解决内存碎片和java垃圾回收算法之-标记清除 中导致的引用更新问题。
复制算法的缺点::

会造成一部分的内存浪费。不过可以根据实际情况,将内存块大小比例适当调整;如果存活对象的数量比较大,复制算法的性能会变得很差。
复制算法的应用场景:

复制算法一般是使用在新生代中,因为新生代中的对象一般都是朝生夕死的,存活对象的数量并不多,这样使用复制算法进行拷贝时效率比较高。
jvm将Heap(堆)内存划分为新生代与老年代。又将新生代划分为Eden与2块Survivor Space(幸存者区) ,然后在Eden –>Survivor Space 与To Survivor之间实行复制算法。
不过jvm在应用复制算法时,并不是把内存按照1:1来划分的,这样太浪费内存空间了。一般的jvm都是8:1。也即是说,Eden区:From区:To区域的比例是始终有90%的空间是可以用来创建对象的,而剩下的10%用来存放回收后存活的对象。

4.5.5 分代算法(主要的算法就是上面四种,这个是附加的)
这种算法,根据对象的存活周期的不同将内存划分成几块,新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。可以用抓重点的思路来理解这个算法。
新生代对象朝生夕死,对象数量多,只要重点扫描这个区域,那么就可以大大提高垃圾收集的效率。另外老年代对象存储久,无需经常扫描老年代,避免扫描导致的开销。

新生代

在新生代,每次垃圾收集器都发现有大批对象死去,只有少量存活,采用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。
老年代

而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须“标记清除法或者标记整理算法进行回收。

5 垃圾收集器
5.1 什么是垃圾收集器?
垃圾收集器是垃圾回收算法(引用计数法、标记清楚法、标记整理法、复制算法)的具体实现,不同垃圾收集器、不同版本的JVM所提供的垃圾收集器可能会有很在差别。
图中展示了7种不同分代的收集器:
Serial、ParNew、Parallel Scavenge、CMS、Serial Old、Parallel Old、G1

而它们所处区域,则表明其是属于新生代还是老年代的收集器:

新生代收集器:Serial、ParNew、Parallel Scavenge

老年代收集器:CMS、Serial Old、Parallel Old

整堆收集器:G1

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【刷算法】复杂链表的复制
【刷算法】复杂链表的复制
11 0
排序算法
因为一直在做应用开发的缘故,自大学学习了数据结构和算法后,就较少使用到算法的知识,大多使用编程语言自带的排序方法。最近项目时间相对宽裕,就想再次拾起那遗落在角落的排序算法知识。 冒泡排序是我最先接触的排序算法,记得大一老师开始讲解这个算法的时候,通过循序渐进的讲解,在最后还特地带我们对这个算法进行了简单的优化,那时感觉,原来算法是这么好玩。
1624 0
排序算法
https://en.wikipedia.org/wiki/Sorting_algorithm http://www.cnblogs.com/eniac12/p/5329396.html   Theory Computational complexity theory Big O nota...
1032 0
归并算法
#include void MSort( ElementType A[], ElementType TmpArray[ ], int Left, int Right) { i...
605 0
打靶算法
#include #include using namespace std; int sum; int store[10]; void Output() { for(int i = 9; i>=0; --i) ...
836 0
排序算法
Bubble SortBuilt in Net CocktailComb SortCountingGnomeInsertSortMergeSortOddevenQuickSortSelectionSortShellStoogeSort
441 0
排序算法
简单排序 冒泡排序 public class BubbleSort { public static void main(String[] args) { ArrayBub a = new ArrayBub(20); a.insert(14); a.insert(144); a.insert(142); a.insert(56); a.insert(23);
970 0
+关注
小威要向诸佬学习呀
每天保持进步就好
64
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载