试着把.net的GC讲清楚(2)

上篇文章说了一些基本概念的东西,然后还有很多东西概念没有头绪,这篇文章我试着解释

GC的回收算法详细步骤?

上篇]文章讲了.net GC的算法是Mark and Compact,不过到底是怎么执行的,我这几天查了资料,找到一篇博客说明了,它分为了几个阶段

Mark phase

这个阶段没得说,就是标记存活对象的,不考虑Weak Reference(弱引用)对象

Plan phase

这个阶段是决定是执行Compact还是直接执行Sweep(上篇讲到猜测LOH执行的是的Mark and Sweep,其实是不正确的)

Relocate phase

这个阶段是Plan phase决定Compact后,开始对需要移动的对象进行地址重新计算,注意这个时候并不移动,只是重新计算地址

Compact phase

这个阶段开始移动对象。

Sweep phase

移动完成对象了还需要Sweep?是因为,GC把所有的对象都修改为了连续的,其中一些对象被回收后还是在存活对象之间。Sweep就是使用Free Object把这些空白的内存填充起来,并添加到一个叫Free list里面。

为什么要用Free object创建填充?不是很清楚,猜测是为了下次回收的时候一块把连续的内存回收了。

为什么会有LOH?

LOH存在的意义也就是为了性能;大对象太大了,移动花费时间太长了,所以做了一个LOH专门存储大对象,这样对他们就区别对待了。

上篇文章说过,>=85000字节就分配到LOH中,为什么是85000?这几天找了很多,发现了是因为在GC申请内存的时候,每次向操作系统申请的一个内存块大小为8k(Allocation Quantum),估摸着跟这个数值有关。

LOH其它一些信息

再次看到一个新颖的说法,说是LOH的gen是3,而不是2,待定

workstation,server GC模式到底区别是啥?

  • workstation GC:这么说吧,它非常的保守的进行内存什么的管理,有点像守财奴,一点点的申请,所以GC申请内存小点。
  • Server GC:就是那种暴发户,往大了申请内存,越多越好,所以可以预见到Server GC模式下,内存耗费是非常惊人的,在查找资料的时候有人在docker中运行.net core的程序,占用内存太大了被重启,改了workstation gc后内存就大幅下降。

其它的concurrent其实就是gc线程是和用户线程可以并行执行的,提高了程序性能,减少了GC时的等待时间

参考

上一篇:实验8 标准模板库STL


下一篇:Java工具类实现校验公民身份证的有效性