复制算法

复制算法:
如果jvm使用了coping算法,一开始就会将可用内存分为两块,from域和to域, 每次只是使用from域,to域则空闲着。当from域内存不够了,开始执行GC操作,这个时候,会把from域存活的对象拷贝到to域,然后直接把from域进行内存清理。

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

coping算法一般是使用在新生代中,因为新生代中的对象一般都是朝生夕死的,存活对象的数量并不多,这样使用coping算法进行拷贝时效率比较高

原文地址:https://blog.51cto.com/9425473/2408597

时间: 2024-10-07 09:04:23

复制算法的相关文章

JVM-内存回收算法--复制算法

复制算法,它将堆上的内存分为两个大小相等的区域,一个是空闲区域,一个是活动区域.在程序运行中,实际使用的是活动区域,也就是有50%的空间被浪费掉. 复制算法的实现过程:1.找出活动空间中所有存活的对象.2.将这些存活的对象复制到空闲区域.3.将之前的活动空间清空,然后,就变为空闲空间了,而存活对象所在的区域,则变为活动空间了. 复制算法的优点,就是,内存回收完毕后,有一大片连续的可用空间.缺点,当然是,在程序运行期间,有50%的内存空间被放着,只有在发生内存回收的时候,GC才会借用空闲区域来实现

《垃圾回收的算法与实现》——GC复制算法

https://www.cnblogs.com/suolu/p/6654236.html 基本概念 GC复制算法将堆分成From和To两个内存块,当From被占满时GC将From中的存活对象复制到To中,同时将From和To交换. 通过递归遍历GC root(即采用深度优先)复制存活对象,对于已经复制过的标记其COPIED字段. 复制过的对象将在From的对象的forwarding记录To中该对象地址,以便于其余引用了该对象的引用进行修改. 分配对象时将先判断From中连续可用空间是否够用(复制

GC算法-复制算法

概述 复制算法就是将内存空间二等分, 每次只使用其中一块. 当执行GC时, 讲A部分的所有活动对象集体移到B中, 就可以讲A全部释放. 画个图就是: ? 在执行GC前, 内存长这样: ? 当执行GC后, 内存就变成这样了: 还记得标记清除算法的问题是什么吗? 内存碎片化严重. 现在好了, 碎片化问题解决了, 每次GC执行后, 内存空间都是连续的啦. 实现 想一想GC执行的步骤是什么? 很简单啊, 遍历所有可访问的对象, 将所有对象的复制到另一块内存中. 完毕. 遍历所有根集合的对象, 跳过. 将

泛型算法(三)之复制算法

1.copy(InputIterator first, InputIterator last, OutputIterator result):复制一个序列到另一个序列 std::vector<int> c; std::vector<int> result; c.reserve(10); result.resize(10); //必须要指定元素数量,具体参考<Effective STL>的条款30 --- 确保目标区域足够大 //向c中添加元素 for (int i =

图解系列之垃圾收集复制算法

原文地址:http://blog.51cto.com/4837471/2324574

jvm垃圾收集(标记-清除,复制,标记-整理,分代)算法

1. 标记 - 清除算法  标记清除算法是最基础的收集算法,其他收集算法都是基于这种思想.标记清除算法分为"标记"和"清除"两个阶段:首先标记出需要回收的对象,标记完成之后统一清除对象. 它的主要缺点:①.标记和清除过程效率不高 . ②.标记清除之后会产生大量不连续的内存碎片. . 2. 复制算法 它将可用内存容量划分为大小相等的两块,每次只使用其中的一块.当这一块用完之后,就将还存活的对象复制到另外一块上面,然后在把已使用过的内存空间一次理掉.这样使得每次都是对其

JVM垃圾收集算法(标记-清除、复制、标记-整理)

 [JVM垃圾收集算法] 1)标记-清除算法: 标记阶段:先通过根节点,标记所有从根节点开始的对象,未被标记的为垃圾对象(错了吧?) 清除阶段:清除所有未被标记的对象 2)复制算法: 将原有的内存空间分为两块,每次只使用一块,在垃圾回收时,将正在使用的内存中的存活对象复制到未被使用的内存块中,然后清除正在使用的内存块中的所有对象. 3)标记-整理算法: 标记阶段:先通过根节点,标记所有从根节点开始的可达对象,未被标记的为垃圾对象 整理阶段:将所有的存活对象压缩到内存的一段,之后清理边界所有的空间

JAVA 数组算法(复制、查找、插入)

一.复制数组算法 //数组复制算法 public class Test{ public static void main(String[] args){ int[] arrA = {100,800,500,600,700}; int[] arrB = new int[arrA.length]; //用for循环把A的对应下标值复制给B for(int i=0;i<arrA.length;i++){ arrB[i] = arrA[i]; } //输出arrB for(int i=0;i<arrB

JVM垃圾回收算法

1.堆的分代和区域 (年轻代)Young Generation(eden.s0.s1  space)    Minor GC (老年代)Old Generation (Tenured space)     Major GC|| Full GC (永久代)Permanent Generation (Permanent  space)[方法区(method area)]    Major GC 本地化的String从JDK 7开始就被移除了永久代(Permanent Generation ) JDK