系列一、堆里面的分区:Eden、From、To、老年代各自的特点

一、堆里面的分区:Eden、From、To、老年代各自的特点

堆是对象共享的区域,也是垃圾回收器主要工作的地方。主要分为新生区、养老区和元空间,而这三块地方中GC主要工作在新生区和养老区,其中新生区占1/3、养老区占2/3,新生区又分为伊甸区和幸存者区,幸存者区又分为幸存者0区(From区),幸存者1区(to区),内存所占比例是8:1:1。垃圾回收主要有四大算法,分别是:1、引用计数器法 2、复制算法

3、标记清除算法 4、标记压缩算法。

1、引用计数器法:

工作原理:每次对对象的引用都维护一个计数器,当该对象的计数器为0的时候,说明没有引用指向该对象了,GC可以对该对象的内存空间进行回收了。

缺点:(1)较难处理循环引用;

(2)每次对对象的引用都需要维护引用计数器,且维护计数器本身也有一定的消耗;

2、复制算法:

工作原理:首先,当伊甸区满的时候会第一次触发GC,把还活着的对象拷贝到From区,当伊甸区再次满的时候,第二次触发GC,这时候GC会扫描伊甸区+From区,对这两个区域进行垃圾回收,经过这次回收后还存活的对象,则直接复制到To区,同时把这些对象的年龄+1。

备注:如果有对象的年龄到达了老年的标准,则复制到老年代区。

其次,清空伊甸区和From区中的对象。经过这次清空之后,原本的From区里边为空,变为了To区

最后,To区和From区互换,原来的To区成为下一次GC时的From区。

优点:不会产生内存碎片;

缺点:GC第二次扫描拷贝存活的对象时,会导致内存减半

3、标记清除算法:

标记清除一般发生在老年代。分为2个阶段:先标记出要回收的对象,然后统一回收这些对象。

同通俗的话解释一下标记清除算法,是指程序运行期间,若可以使用的内存即将被耗尽时,GC线程将会被触发并将程序暂停,随后将要清除的对象标记一遍,最终统一回收这些对象,完成标记清理工作接下来便让应用程序恢复运行。

两个阶段

标记:从引用根节点开始标记遍历所有的GC Roots,先标记出要回收的对象;

清除:遍历整个堆,把标记的对象清除;

缺点:此算法需要暂停整个应用,会产生内存碎片。

4、标记压缩算法:

在整理压缩阶段,不再对标记的对象回收,而是将所有存活着的对象都向一端移动,然后直接清除边界以外的内存。可以看到标记的存活对象将会被整理,按照内存地址依次排列,而未被标记的内存将会被整理掉。如此一来,当我们需要给新对象分配内存时,JVM只需要持有一个内存的起始地址即可,这比维护一个空闲列表显然少了许多开销。

优点:标记压缩算法不仅可以弥补标记清除算法中,内存区域分散的特点,也消除了复制算法当中,内存减半的高额代价。

缺点:比复制算法多了一个标记的阶段,又比标记/清除多了一个整理内存的过程。

相关推荐
步步为营DotNet25 分钟前
从分代预算到 DATAS:.NET GC 调优到底在调什么
c#·.net·内存管理·gc·datas
淡海水27 分钟前
05-03-源码-Boehm GC分配与碎片管理
开发语言·算法·unity·c#·游戏引擎·gc
狂奔的sherry4 天前
JRuby 多线程反引号偶发 127:GC 提前释放了 posix_spawn 的 argv
java·linux·ruby·gc·jruby
淡海水4 天前
03-03-架构篇-SGen GC架构解析
unity·架构·c#·gc·sgen
淡海水6 天前
03-02-架构篇-Boehm GC架构解析
unity·架构·c#·gc·boehm
淡海水8 天前
02-07-原理篇-GC暂停时间的本质
开发语言·unity·c#·gc·暂停时间
淡海水8 天前
02-06-原理篇-增量式GC与并发GC
算法·unity·c#·并发·gc·增量
淡海水9 天前
02-04-原理篇-GC Roots与对象图遍历
算法·unity·c#·图·gc·遍历·roots
hez201010 天前
一行代码在 .NET 项目里启用 Satori GC
c#·.net·.net core·gc·clr
CSharp精选营15 天前
.NET 面试必问的 8 道 GC 题,建议收藏
.net·面试题·gc·c#面试题