您的位置:首页 > 编程语言 > Java开发

java垃圾回收算法,面试常问原理

2020-01-13 00:05 267 查看

最为基础的算法,“标记清除法”跟他的名字一样,算法分为两个阶段,”标记”阶段,跟”清除”阶段。说他是最基础打的算法,是因为后续的算法都是以他为基础而改进得到的,

他主要有两个不足:一是标记跟清除的效率都不高,另一方面,在回收之后会有大量的不连续空间碎片,这就会导致之后程序需分配大块连续的内存时,无法找到在足够的连续内存而不得不提前进行另一次的垃圾回收动作,

复制算法:

为了解决效率问题,于是就出现了“复制算法”它可以将内存按照容量划分为大小相同的两块,每次只使用一块,当这块内存用完后,会将还存活的对象另一块等大的内存中,最后再把已使用过的内存空间清理掉。这样每次都只会对半个内存回收,分配时不需要考虑内存空间碎片等问题。但这样的代价就是牺牲了一半的内存,成本太高。

然鹅,现在得商业虚拟机都采用这种算法来处理新生代 ,因为新生代 “朝生夕死”,所以不需要按照1:1的比例来分配,而是将内幕分为一块较大的Eden 和 两块Survivor区域,每次使用Eden和其中一块的Survivor区域,当进行垃圾回收时,会将Eden和使用过的Survivor中存活的对象复制到另一块没使用过的Survivor区域中。HotSpot默认Eden 和 Survivor比例为8:1,这样相对1:1浪费一半的内存来说,我们只浪费了10%的内存。

我们不能保证每次会后过后存活对象都不超过10%,因此,当Survivor区域内存不够时,就需要依赖老年代来进行分配担保

(Handle Promotion ) ps:最好对这些单词印象加深下下生的以后看到只是似曾相识.

戳二维码拥有

戳二维码拥有

标记整理法

复制算法的缺陷在于,当对象的存活率高时,我们就需要进行繁多的复制,效率就会下降,更关键的是,如果不想浪费一半的内存空间,就需要新增分配担保,来应对对象都是”老不死”的极端情况,所以年老带不适合用复制算法。

根据年老带的特点,标记整理算法,跟标记清除前段一样都是标记过程,但后续步骤不是直接清除,而是将存活的对象都向一端移动,最后直接清理掉边界以外的内存。

分代收集

按照对象对象存活周期的不同, 将内存划分为几块。一般是把Java堆分为新生代和年老带,根据各个年代采用最合适的算法。譬如在新生代每次垃圾回收只有少量的存活,就使用复制法,在年老代中,对象都活的久,没有额外的内存担保空间,就必须采用“标记清除”出或者“标记整理”。

  • 点赞
  • 收藏
  • 分享
  • 文章举报
站内首发文章 zhupanlinch 发布了73 篇原创文章 · 获赞 0 · 访问量 2232 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: