GC原理

GC(Garbage Collection)作为托管的内存管理机制,为开发人员提供了一下的便利:

  1. 允许你自由的开发应用程序,而不必担心内存释放的问题。
  2. 高效的在托管堆上创建对象。
  3. 回收不再使用的对象、释放他们占用的内存,为下次的内存分配做准备。
  4. 提供安全的内存访问。

CLR内存管理的几个要点

  1.  每个进程有自己独立的虚拟内存空间,所有的进程共享物理内存。
  2. 一般情况下在32位的计算机上,每个进程有2G的用户模式的虚拟地址空间。
  3. 作为一个应用开发者,你只会访问虚拟地址空间,而不会去操作真实的物理内存。GC会在托管堆上帮你完成虚拟内存的分配和释放工作。如果你正在编写本地代码,并且通过WIN32API操作虚拟内存,这些API将会在本地堆上为你分配和释放虚拟内存。
  4. 虚拟内存的三个状态:未分配(内存块没有被引用,并且可以被分配);预分配(内存块可以而且只能被你使用,但你不能执行数据存储直到该内存块变成已分配状态);已分配(内存块被指向物理内存,可用)。
  5. 虚拟地址空间可以变得碎片化。这意味着内存中存在碎片或者空洞。当一个虚拟内存分配请求发生时,虚拟内存管理器必须找到一个可用的足够大的内存块来满足分配请求。即使你有2 GB的空闲空间,但内存分配也可能失败,除非这些地址空间都是连续的
  6. 如果你耗尽了保留虚拟内存空间或者没有足够的物理内存在执行最终分配,就会产生内存溢出。
  7. 即便物理内存的占用率很低, 虚拟内存页面文件也是会被使用的。当内存使用率首次到达一个峰值时,操作系统就会将内存中的数据转移到虚拟内存页面文件,以便腾出空间用于数据存储。

GC进行垃圾回收的时间点

  1. 当系统物理内存过低时。
  2. 当托管堆上分配的对象空间超出了一个阈值时。
  3. 当GC.Collect()被调用时。

托管堆

        当GC被CLR初始化之后,它会分配一段内存用来存储和管理对象。这段内存叫托管堆,有别于操作系统的本地堆。

        每个托管进程都有一个托管堆,每个进程的所有线程共享托管堆。

       当一个内存分配请求开始时,GC会调用Win32 VirtualAlloc函数,一次性的为托管应用分配内存空间。GC会通过调用Win32 VirtualFree来释放内存空间。

       永远不要创建大于你需要的内存空间来增加GC的压力。

      当垃圾回收机制被触发时,GC会清除不再使用的对象,压缩可用对象,使他们在地址上连续。

      托管堆可以被认为是分为两部分,大对象堆和小对象堆。大对象堆上存储超过85000byte(包含)的对象。

 

    托管堆被分为不同的代,以便更好的管理长生命周期和短生命周期的对象。内存回收的动作通常会有只占用托管堆少量空间的短生命周期对象触发。

   G0   存储短生命周期的对象,例如局部变量。这个代上最容易发生垃圾回收。新创建的对象都会存在于这一代, 除非是大对象,则存储在大对象堆上。

大多数的对象都只会存在于G0而不会持续到下一代。

    G1   这个代上的对象是介于短生命周期对象和长生命周期对象之间的缓冲代。   

    G2   这个代上存储的都是长生命周期的对象,比如静态变量。

 

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值