第二篇:jvm之垃圾回收算法 ,HotSpot的算法实现

一、标记-清除算法Mark-Sweep
问题:
1.效率不高。
2.产生大量的不连续的内存碎片,空间碎片太多会导致在 以后程序运行过程中如果需要分配较大的对象时,无法找到足够的内存而不得不提前执行另一次垃圾回收。

二、复制算法Copying
为了解决效率问题,将内存一分为二,将存活的内存复制到另一半,再把已使用的内存空间一次性回收。
该算法将内存一分为二,运行时可用内存仅为整个内存的一半,代价太大高,浪费严重。

IBM公司研究表明:新生代中98%的对象都是“朝生夕死”,所以不必按照1:1的比例来划分内存。
将内存划分为一个较大的Eden控件和两块较小的Survivor空间,且每次只只用Eden和Survivor。
当需要回收时,将Eden和刚刚用过的Survivor空间清理掉。HotSpot虚拟机默认的Eden和Survivor比例是:8:1,即每次新生代中可用内存是整个新生代的90%。在特殊情况下,另外的10%不够用时,可以箱老年代进行申请分配控件。
三、标记-整理算法
老年代一般采用标记-整理算法。和标记-清除算法类似,只是在后续的操作不是对对想直接回收,而是将所有存货的对象向一端移动,然后清理掉边界以外的内存。

四、分代回收算法
当代商业虚拟机的垃圾回收器都采用个“分代回收”算法,根据对象存活周期的不同,划分为几块。
java堆一般分为新生代和老年代。
新生代在短期内常常会出现大批量对象死去,所以一般使用复制算法,每次只需要付出少量存货对象的代价即可完成回收。
老年代存活率较高,没有额外的空间进行分配,所以一般采用“标记--清理”或者“标记--整理”算法。
五、分代回收算法
1.枚举根节点
Stop-The-World
OopMap存放对象的引用(记录对象的类型个、偏移量、栈、寄存器那些位置是引用)
2.安全点 safepoint
当程序执行到safepoint时,即发生GC,同事所有线程执行到safepoint时发生Stop-The-World.
当发生Stop-The-World时,线程需要中断,那么中断的策略有2中,抢占式中断Preemptive Suspension [prɪ'emptɪv] [səˈspenʃn]和主动式中断Voluntary Suspension [ˈvɒləntri] 。现在虚拟机都采用主动中断方式,设置标记,所有线程轮训这个标记,而该标记又和safepoint重合。
3.安全区域 Safe Region
在线程不执行,例如sleep,blocked的时候,程序没有运行,且没有得到CPU分配时间,那么线程就无法相应jvm的中断请求,此时safe point就 无法解决问题,此时需要Safe Region。
Safe Region的意思是在一段代码片段中,引用关系没有发生变化。在这块区域任何地方开始GC都是安全的,Safe Region也可作为Safe Point的扩展。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值