栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java垃圾回收主要算法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java垃圾回收主要算法

1.标记清除

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

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

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

2.复制算法

复制算法是将一整块内存划分为两份
只使用其中一份存储,在标记完垃圾之后,将不是垃圾的对象复制到另一份内存中,将之前的这一半内存全部回收。

优点:解决了内存碎片问题;
缺点:有局限性,如果需要复制的对象多,那么效率可能会很低;
内存只使用一半,利用率低;

3.标记整理

类似于顺序表中删除中间元素的方式,标记整理是将后边的元素往前移动。

优点:内存利用率高,没有内存碎片
缺点:内存搬运操作频繁,效率不高

4.分代回收

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

大致流程:

  1. 新对象的内存在伊甸区中分配;
  2. 有经验规律表明,伊甸区中绝大部分新对象躲不过一轮GC,所以熬过一轮GC的对象就进入幸存区;
  3. 在两个幸存区中,使用复制算法,每次经过GC考验的对象就复制到另一个幸存区,反复进行这个过程;
  4. 在经过重重考察后,该对象就进入老年代,在老年代中GC的频率会比新生代中的频率大大降低。
    (例外,如果一个对象的内存太大,就不适合在新生代幸存区中来回复制,就直接进入老年代。)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/270877.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号