垃圾回收机制(GC)总结报告(二)

 

1、GC的基本概念

     Garbage Collector 就是垃圾收集以应用程序的root为基础,遍历应用程序在Heap上动态分配的所有对象,通过识别它们是否被引用来确定哪些对象是已经死亡的、哪些仍需要被使用。已经不再被应用程序的root或者别的对象所引用的对象就是已经死亡的对象,即所谓的垃圾,需要被回收。这就是GC工作的原理。

本质: 跟踪所有被引用到的对象,整理不再被引用的对象,回收相应的内存。

2、内存管理基本概念:

(1)每个进程都有其自己单独的虚拟地址空间。同一台计算机上的所有进程共享相同的物理内存,如果有页文件,则也共享页文件

(2)默认情况下,32 位计算机上的每个进程都具有 2 GB 的虚拟地址的用户空间,2GB的系统空间。

(3)作为一名应用程序开发人员,您只能使用虚拟地址空间,请勿直接操控物理内存。垃圾回收器为您分配和释放托管堆上的虚拟内存

(4)虚拟内存有三种状态:

自由(free)。 该内存块没有引用关系,可用于分配。

保留(reserved)。 是虚拟地址已经被保留,并且不能被操作系统或进程中的其他线程重新分配

提交(committed)。 内存块已指派给物理存储,并且直接映射到物理地址。

3、Mark-Compact 标记压缩算法

将线程挂起=>确定roots=>创建reachable objects graph=>对象回收=>heap压缩=>指针修复

阶段1: Mark-Sweep 标记清除阶段

    先假设heap中所有对象都可以回收,然后找出不能回收的对象,给这些对象打上标记,最后heap中没有打标记的对象都是可以被回收的

阶段2: Compact 压缩阶段

    对象回收之后heap内存空间变得不连续,在heap中移动这些对象,使他们重新从heap基地址开始连续排列,类似于磁盘空间的碎片整理

检测、标记对象引用,是一件很有意思的事情,有很多方法可以做到,但是只有一种是效率最优的,.Net中是利用栈来完成的,在不断的入栈与出栈中完成检测:先在树图中选择一个需要检测的对象,将该对象的所有引用压栈,如此反复直到栈变空为止。栈变空意味着已经遍历了这个局部根(或者说是树图中的节点)能够到达的所有对象。

4、对象堆的概念

进程初始化期间,CLR保留两个区段(segment)的虚拟地址空间:一个区段是普通堆,另一个区段是大对象堆。每个区段的大小是不同的。(客户端16MB/服务端64MB、32位操作系统/64为操作系统、CPU多少个)

85000字节(83kb)以下的对象称为小对象,分配在Gen 0 heap中,85000字节以上的对象称为大对象,分配在Large Object Heap中

obj1、obj2释放之后,其空间合并起来成为free list的一个节点,随后被分配给obj4

5、垃圾回收的5个时机:

(1)   第0、1、2代满

(2)    显式调用GC.Collect

(3)    Windows报告内存不足

(4)    CLR卸载AppDomain (程序的入口点Main方法就是在这个默认的AppDomain中执行。)

(5)    CLR关闭(进程关闭)

备注:

在一个进程中可以包含多个应用程序域,一个应用程序域可以有多个线程,并装载一个可执行程序(*.exe)或者多个程序集(*.dll)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值