复制算法

简介: 复制算法

标记–整理算法优点:

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

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

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

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

相关文章
|
缓存 算法 Java
详解gc(垃圾回收)机制三:GC复制算法
详解gc(垃圾回收)机制三:GC复制算法
486 1
详解gc(垃圾回收)机制三:GC复制算法
|
存储 算法 Java
JVM中的垃圾收集算法详解(标记清除算法、标记复制算法、标记整理算法)
说到垃圾收集器必须要提的就是垃圾收集算法,因为所有的垃圾收集器都是基于垃圾收集算法实现的,垃圾收集算法是垃圾收集器的方法论,了解了这些方法论,对垃圾收集器的工作原理也就清楚了。说到垃圾收集算法,那么必须得提分代收集理论,因为有了分代收集理论才有了垃圾收集算法。
509 0
JVM中的垃圾收集算法详解(标记清除算法、标记复制算法、标记整理算法)
|
算法 知识图谱
【数据结构和算法】二叉树的创建,遍历,复制,结点计算,高度计算
【数据结构和算法】二叉树的创建,遍历,复制,结点计算,高度计算
106 0
【数据结构和算法】二叉树的创建,遍历,复制,结点计算,高度计算
|
算法 Java
Map与Set高频面试算法题(只出现一次的数字,复制带随机指针的链表,宝石与石头,旧键盘,前k个高频单词)(Java实现)
给一个非空整数数组,只有一个元素出现了一次,剩余的元素都出现了两次,,请找出那个只出现一次的数字
Map与Set高频面试算法题(只出现一次的数字,复制带随机指针的链表,宝石与石头,旧键盘,前k个高频单词)(Java实现)
|
存储 算法 Java
图解 Raft 共识算法:如何复制日志?
上次讲到 Raft 领导者选举:「图解 Raft 共识算法:如何选举领导者?」,接着这个话题继续跟大家聊下关于 Raft 日志复制的一些细节。
409 0
图解 Raft 共识算法:如何复制日志?
|
算法 Java 索引
【每日算法】复制带随机指针的链表:「哈希表」&「原地算法」|Python 主题月
【每日算法】复制带随机指针的链表:「哈希表」&「原地算法」|Python 主题月
|
算法 C语言 C++
算法大神对小码农说复制随机链表可以单独拿出来讲讲
算法大神对小码农说复制随机链表可以单独拿出来讲讲
87 0
算法大神对小码农说复制随机链表可以单独拿出来讲讲
|
算法 Java
【Java 虚拟机原理】垃圾回收算法 ( 标记-清除算法 | 复制算法 | 标记-整理算法 )
【Java 虚拟机原理】垃圾回收算法 ( 标记-清除算法 | 复制算法 | 标记-整理算法 )
172 0
【Java 虚拟机原理】垃圾回收算法 ( 标记-清除算法 | 复制算法 | 标记-整理算法 )
|
算法 Java Android开发
Android 内存优化】垃圾回收算法 ( 内存优化总结 | 常见的内存泄漏场景 | GC 算法 | 标记清除算法 | 复制算法 | 标记压缩算法 )
Android 内存优化】垃圾回收算法 ( 内存优化总结 | 常见的内存泄漏场景 | GC 算法 | 标记清除算法 | 复制算法 | 标记压缩算法 )
223 0
Android 内存优化】垃圾回收算法 ( 内存优化总结 | 常见的内存泄漏场景 | GC 算法 | 标记清除算法 | 复制算法 | 标记压缩算法 )
下一篇
无影云桌面