佳木斯特产:.net 垃圾接纳

admin 6个月前 (04-16) 科技 38 0

垃圾接纳器帮我们处理了内存中不在使用的工具,提高了机械的性能,让开发人员轻松了许多。

你真的领会垃圾接纳吗?

或许你知道垃圾接纳,听说过是通过符号接纳,可是怎么符号接纳呢就不是很清晰了,好吧,若是不清晰就继续往下看。若是你是大神对这块了如执掌,请直接跳过,欢迎来提差别的意见。

1、我们先来聊一下内存分配:

代码中声明变量是需要向内存申请地址的,内存呢又分托管堆和栈,我们今天主要聊的就是托管堆内存

啥事托管堆内存呢?想必列位也心中知道,不知道的自行百度谷歌去。

写代码中通常需要使用new声明的变量都是引用类型变量,使用的都是托管堆内存地址,那声明晰一个工具,需要分配多大的控件呢?

1.1、这个时刻就需要盘算类型的字段需要的字节数了

1.2、引用类型工具开销的字节数还需要(类型工具指针和同步索引块)

  在32位应用中,这多出来的两个字段各需32位字节地址空间,以是每个工具需要多占用8个字节的地址控件

  在64位应用中,这多出来的两个字段各需64位字节地址空间,以是每个工具需要多占用16个字节的地址控件

1.3、内存申请后,CLR会检查保留区是否能够提供分配工具所需的字节数,使用new 声明的工具会向托管堆请求地址分配,并返回工具地址,NextObjPtr指针会加上工具占有的字节数,获得一个新值

2、垃圾接纳-Go Go Go

垃圾接纳的基本逻辑:垃圾接纳器会检查托管堆中是否又应用程序不再使用的任何工具,若是有,它们使用的内存就可以接纳了。

接纳之前的托管堆如下:

下面我们来聊一下符号接纳的整个历程:

2.1、首先,应用有一组根(root)每个根都是一个存储位置,其中包罗指向引用类型工具的一个指针,指针要么引用托管堆中的一个工具,要么为null

  例如:类型中界说的任何静态字段被认为是一个根

    &NBsp;  任何方式参数或局部变量也被认为是一个根,只有引用类型的变量才被认为是一个根,值类型不能被认为是根。

2.2、垃圾接纳的第一阶段,符号阶段:

  这时,垃圾接纳器会沿着线程栈上行以检查所有根,若是发现一个根引用了一个工具,就在工具 “同步索引块”上开启一位---符号,

  以递归的方式遍历所有可达的工具。若是垃圾接纳器试图符号一个先前符号过的工具,就会住手沿这个路径走下去。

    这个行为有两个目的:

      1、垃圾接纳器不会多次遍历一个工具,以是性能获得显著增强

      2、若是工具存在循环链表,可以制止无线循环。

   检查完所有的根之后,堆中将包罗一组已符号和未符号的工具,已符号的工具是代码可达的工具,而未符号的工具是不可达的,不可达的工具被认为是垃圾,它们占用的内存是可以被接纳的

垃圾接纳之后的托管堆如下:

2.3、垃圾接纳的第二阶段,压缩阶段:

  这个时刻该接纳内存空间已经都接纳了,空出来的内存可能是前头一块,中心一块,后边又一块。

  垃圾接纳器线性遍历堆,以寻找未符号工具的延续内存块,若是发现内存块比较小,则忽略,若是发现大的,可用的延续内存块,垃圾接纳器会把非垃圾的工具移动到这里以压缩堆。

 

参考:CLR Via C#(第三版)

  

,

申博Sunbet

申博Sunbet-有你喜欢的sunbet真人、sunbet电子、sunbet棋牌、sunbet代理合作。

Allbet声明:该文看法仅代表作者自己,与本平台无关。转载请注明:佳木斯特产:.net 垃圾接纳

网友评论

  • (*)

最新评论

文章归档

站点信息

  • 文章总数:458
  • 页面总数:0
  • 分类总数:8
  • 标签总数:880
  • 评论总数:124
  • 浏览总数:2789