当前位置:   article > 正文

Java垃圾回收主要算法_java 不同版本 垃圾回收算法

java 不同版本 垃圾回收算法

1.标记清除

先标记出垃圾,然后再清除垃圾。
标记时利用可达性分析,可达的对象刨除,不可达的对象标记为垃圾,然后将其清除,即释放该对象所占的内存空间。

优点:简单,容易实现
缺点:可能会产生大量的内存碎片

例如,假设有五个对象占用五份内存,此时2,4为垃圾,则将其所占空间释放,空闲的空间就会和正在使用的空间穿插开了,变成一块块空间碎片。
但在代码中我们经常会申请一个连续的内存空间,如果碎片太多,总的剩余空间有50M,但是是由50个1M的空间碎片组成,如果我们想要申请一个3M的连续空间,则无法满足。
在这里插入图片描述

2.复制算法

复制算法是将一整块内存划分为两份
只使用其中一份存储,在标记完垃圾之后,将不是垃圾的对象复制到另一份内存中,将之前的这一半内存全部回收。
在这里插入图片描述
优点:解决了内存碎片问题;
缺点:有局限性,如果需要复制的对象多,那么效率可能会很低;
内存只使用一半,利用率低;

3.标记整理

类似于顺序表中删除中间元素的方式,标记整理是将后边的元素往前移动。
在这里插入图片描述
优点:内存利用率高,没有内存碎片
缺点:内存搬运操作频繁,效率不高

4.分代回收

分代回收是将回收的过程分为了几个不同的场景,不同的场景下采取不同的回收方式。
基于一个经验规律,一个对象存活的时间越久,那么就认为这个对象继续存活的可能性就越大。(例如百度,腾讯之类的大公司,不会轻易倒闭一样)
举一个典型的分代回收的例子
根据对象躲过的GC的轮次(JVM会周期性的对内存进行可达性分析)将其划分为新生代和老年代,新生代中又包含伊甸区和两个幸存区。
在这里插入图片描述
大致流程:

  1. 新对象的内存在伊甸区中分配;
  2. 有经验规律表明,伊甸区中绝大部分新对象躲不过一轮GC,所以熬过一轮GC的对象就进入幸存区;
  3. 在两个幸存区中,使用复制算法,每次经过GC考验的对象就复制到另一个幸存区,反复进行这个过程;
  4. 在经过重重考察后,该对象就进入老年代,在老年代中GC的频率会比新生代中的频率大大降低。
    (例外,如果一个对象的内存太大,就不适合在新生代幸存区中来回复制,就直接进入老年代。)
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/397668
推荐阅读
相关标签
  

闽ICP备14008679号