垃圾收集算法对比
来源:互联网 发布:最强nba球员数据对比 编辑:程序博客网 时间:2024/05/16 19:49
垃圾收集算法
1. 标记-清理算法
标记清理算法是垃圾收集算法中最基础的算法,其他算法都是在他的基础上优化得到的,垃圾收集算法主要分为标记和清除两个阶段,标记即标记中需要回收的对象,标记完成之后对标记的对象做清理操作。该算法有两个不足点:1. 效率不高,标记和清理两个过程的效率都不高; 2. 空间问题,标记清理之后会产生大量的空间碎片,如果需要分配一个连续空间存储大对象,则会提前触发垃圾的回收。
2. 复制算法
为了解决效率标记-清除算法中的效率问题,复制算法随之产生,复制算法是将内存空间分为两块,当其中一块内存用完之后,将存活的对象复制到另一块内存区域中。接着将使用过的内存空间一次清理掉,这样使得每一次都对一半的内存区域进行回收,不需要考虑内存中的碎片问题。但是他会造成内存空间的浪费,这种算法只有一半的内存空间是可用的。
商业虚拟机一般采用这种算法来回收年轻代,据统计,年轻代的空间回收率大概在98%左右,大部分对象都是处于“朝生暮死”的状态。因此不需要按照1:1的比例来分配内存空间。而是将内存分为一块较大的Eden区和两个较小的Survivor区,每次都是用Eden区和其中的一块Survivor区,当进行对象回收时,将Eden和Survivor区存活的对象都复制到另一块Survivor区中。最后清理刚刚使用的Eden和Survivor区的所有内存空间。HotSpot虚拟机默认是8:1的比例。这样损失的内存即为年轻代内存的1/10。如果Survivor区没有足够的内存存储存活的对象的话,需要有一块内存区域做“担保”。这块内存区域便是老年代。
3. 标记整理算法
复制收集算法在存活率较高的时候,需要做大量的复制,效率会变低,并且如果不想浪费50%空间的话,就必须要有担保以避免被使用的内存中所有的对象100%存活,所以老年代一般不使用这种方法。
标记整理算法是:标记过程和标记-清理算法一样,当时后续并不是对回收的对象进行处理,而是将存活的对象向内存的一端移动,然后清理掉另一端的所有内存。
4. 分代收集算法
当前商用虚拟机的垃圾收集都采用“分代收集”算法,这中算法是根据存活周期的不同将内存分为几块。HotSpot虚拟机将内存分为新生代和老年代,新生代的对象存活率比较低,采用复制算法,并且有老年代做担保,而老年代的对象存活率高,并且没有额外的空间做担保,所以一般采用“标记-清除”算法或“标记-整理”算法进行回收。
- 垃圾收集算法对比
- 4、垃圾收集之垃圾收集算法
- 垃圾收集算法和垃圾收集器
- 垃圾收集算法和垃圾收集器
- 垃圾收集算法与垃圾收集器
- java垃圾收集算法
- java垃圾收集算法
- java垃圾收集算法
- java垃圾收集算法
- java垃圾收集算法
- Java垃圾收集算法
- 垃圾收集算法
- 垃圾收集算法
- JVM垃圾收集算法
- 垃圾收集算法
- 垃圾收集算法
- 垃圾收集,火车算法
- 垃圾收集算法
- Redis学习-String
- 巧用reduce、filter过滤数组中的相同的元素
- 软件工程(C编码实践篇)实验一
- 剑指Offer--5.用两个栈实现队列
- 剑指offer之一---二维数组中的查找
- 垃圾收集算法对比
- POJ 1743:后缀数组求 不重叠最长重复子串
- Java实现二叉树的前序、中序、后序以及层次遍历
- Node中http模块详解(服务端篇)
- 变量名命名
- 大数据预科班9
- 【Unity3D】导入FBX模型使用Legacy动画的Scale缩放问题
- gcc编译流程&存储布局&位运算
- 逻辑回归与梯度下降