new与垃圾回收

new

  new关键字返回的是一个指向堆上对象的引用,而不是真正的对象本身。这个引用变量保存在栈内,以供应用程序以后使用。

  1、使用new关键字将一个对象分配在托管堆上,然后不用再管:当对象从代码库的任何部分都不可达时,垃圾回收器就会从堆中删除它。

  2、托管堆不只是一个由CLR访问的随机内存块。.NET垃圾回收器是堆的“清洁工”,它会压缩空的内存块来实现优化(必要的时候)。

newobj指令通知CLR执行下面的核心任务

  1、计算分配对象所需要的总内存数(包含类型的成员变量和类型的基类所需的必要内存)

  2、检查托管堆,确保有足够的空间来放置要分配的对象。

  3、在将引用返回给调用者之前,移动下一个对象的指针,指向托管堆上的下一个可用的位置。

  当处理newobj指令时,如果CLR判定托管堆没有足够的空间来分配所请求的类型,它会执行一次垃圾回收来尝试释放内存。

  如果托管堆没有足够的内存来分配所请求,就会进行垃圾回收。当确实发生垃圾回收时,垃圾回收器暂时挂起所有在当前进程(process)中所有的活动的线程(thread)以保证应用程序在回收过程中不会访问堆。

  

原文地址:https://www.cnblogs.com/76674718/p/1594223.html