• 作者:老汪软件技巧
  • 发表时间:2024-08-18 17:05
  • 浏览量:

前言

对新生代分区的思考有感,供参考,前提是了解一些垃圾回收算法,如标记-清除、标记-整理、标记复制等,文末有补充

为什么要分为Eden和Survivor?

只用一个Eden区不就好了,通过标记-整理算法也解决了内存碎片的问题啊

主要还是效率问题,效率不够高,标记整理算法需要遍历整个内存区域,效率太低

YoungGC是比较频繁的,加上大部分对象都是会被清理的,如果采用了标记整理,就会导致遍历太多无用的对象

此时标记复制就非常合适了,新生代空间小,复制的代价不会很大,也不需要遍历那么多无用的对象

通常我们说复制,都是从一个地方复制到另一个地方,不会说复制回自己本身,那我就想复制回本身不可以吗?可以

在分Eden和Survivor,我认为跟职责划分也有关系,对象是从Survivor晋升到老年代的,可以这样理解

Eden区是用来筛选可能长时间存活的对象的

Survivor是用来管理对象晋升到老年代的时机的

为什么要设置两个Survivor区

设置两个Survivor区最大的好处就是解决了碎片化,刚刚新建的对象在Eden中,经历一次Minor GC,Eden中的存活对象就会被移动到

第一块Survivor0,Eden被清空,等Eden区再满,就再触发一次Minor GC,Eden和Survivor0中的对象又会被复制送入Survivor1中

这个过程非常重要,因为这种复制算法保证了Survivor1中来自Survivor0和Eden两部分的存活对象占用连续的内存空间,避免内存碎片

_取消标记活动分区_标记处数分区

是吧,好像看上去是没啥问题,但是就是忘记了Survivor也是会清理对象的,那这个是又要用什么回收算法?

然后Survivor0和Survivor1互换,不断重复上述步骤,如果Survivor1存不下了,再次发生YoungGC,然后将达到一定年龄的对象

放入老年代

标记-清除

直接将该被回收的对象直接进行回收

缺点 :

标记-整理

将该被回收的对象回收后,会将内存进行整理,解决了内存碎片的问题

缺点 :

标记-复制

缺点 :需要占用双倍的内存,空间换时间了


上一条查看详情 +使用 node.js 生成不限制的微信小程序码
下一条 查看详情 +没有了