jvm垃圾清理——gc

文章介绍了垃圾回收的两种主要算法——引用计数法和可达性分析算法,其中Java采用可达性分析。接着详细讨论了四种具体的垃圾回收算法,包括标记-清除、复制、标记-整理以及针对不同对象生命周期的分代收集算法,强调了每种算法的优缺点和适用场景。
摘要由CSDN通过智能技术生成

判断对象是否可以回收,业界主要有两种算法:
1. 引用计数法
·老牌垃圾回收算法
·通过引用计算来回收垃圾
·使用者:
COM
ActionScript3
Python

2.可达性分析算法
从GC Root对象向下搜索其所走过的路径称为引用链,当一个对象不再被任何的GC root对象引用链相连时说明该对象不再可用,GC root对象包括四种:方法区中常量和静态变量引用的对象,虚拟机栈中变量引用的对象,本地方法栈中引用的对象; 解决循环引用是因为GC Root通常是一组特别管理的指针,这些指针是tracing GC的trace的起点。它们不是对象图里的对象,对象也不可能引用到这些“外部”的指针。

Java GC采用的是第二种方法,可达性分析算法。

垃圾回收算法:
1.标记-清除算法
先标记所有需要回收的对象,在标记完成后统一回收所有被标记的对象。
缺点:效率不高;易产生不连续的内存碎片。


2.复制算法
将内存空间分为大小相等的两块。只使用其中的一块。
每次清理时,将正在使用的空间中存活的对象复制到另一块空间内。
优点:实现简单、运行高效、不会产生内存碎片。
缺点:内存会缩小一半。

现在的商业虚拟机都采用这种算法来回收新生代。
IBM的研究表明,新生代中98%的对象都是“朝生夕死”的,因此不需要按照1:1的比例来划分内存空间。而是将内存分为一块较大的Eden空间和两块较小的Survivor空间。每次使用Eden和其中的一块Survivor。(HotSpot默认Eden和Survivor的比例为8:1)
回收时,将Eden空间和使用的Survivor一起复制到另一块Survivor中。
这时候可能会存在问题:如果Survivor空间不够用。 此时就需要老年代的内存来进行分配担保,也就是说剩余的对象会直接进入老年代。

3.标记-整理算法
分为标记、整理两个阶段。标记阶段和标记-清除算法里面的标记阶段一样; 整理阶段则会让所有的存活的对象都向一端移动,然后直接清理掉边界以外的内存。

特点:不易产生内存碎片、不占用额外内存空间。适用于对象存活率较高的场景(老年代)。

4.分代收集算法
当前商用虚拟机的垃圾回收器都采用分代收集,分代收集严格上说不算一种新的算法。 只是根据对象存活周期的不同将内存再划分为几块(一般是新生代和老年代)。
根据不同年代对象的特点,来选取不同的回收策略。
比如新生代存活率很低,适用于复制算法;老年代存活率很高,就适用于标记-清除、标记整理算法。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值