C# 当我给MyObject obj=newmyobject()时发生了什么
我知道'new'关键字将调用构造函数并初始化托管堆中的对象 我的问题是CLR如何做以下工作C# 当我给MyObject obj=newmyobject()时发生了什么,c#,.net,garbage-collection,clr,C#,.net,Garbage Collection,Clr,我知道'new'关键字将调用构造函数并初始化托管堆中的对象 我的问题是CLR如何做以下工作 CLR如何执行上述行 CLR如何为对象分配Memory CLR如何确定对象的大小 如果堆中没有空间为对象分配内存,CLR如何知道这一点 创建引用类型(类、委托、接口、字符串或对象)时,会将其分配到堆中。.Net有四个不同的堆:(gen0、gen1、gen2)(小对象堆)和LOH(大对象堆)。85k或更小的所有数据都会根据创建时间(从gen0到gen1再到gen2,等等)在前三个堆中的一个堆中存储。大于85
创建引用类型(类、委托、接口、字符串或对象)时,会将其分配到堆中。.Net有四个不同的堆:(gen0、gen1、gen2)(小对象堆)和LOH(大对象堆)。85k或更小的所有数据都会根据创建时间(从gen0到gen1再到gen2,等等)在前三个堆中的一个堆中存储。大于85k的对象将放置在LOH上。LOH永远不会被压缩,所以最终,我正在执行的类型的分配将最终导致OOM错误,因为对象将分散在该内存空间中。这些称为托管堆 要创建对象,只需使用new关键字。NET将负责创建、初始化对象并将其放置在正确的堆上,并保留任何必要的额外内存。在那之后,你几乎可以忘记那个对象,因为你不必在处理完它后删除它 当您使用new关键字创建引用类型对象时,它被放置在堆上,并且它的引用主要在当前运行的堆栈中使用。还有其他可能的源可以将对象用作参考:
MyObject obj = new MyObject();
很容易假设MyClass在分配时的大小包括:
•19个字符
•86000字节
事实上,对象的大小将只包括一般类内容,以及存储指向字符串和字节数组(类级变量)的对象指针所需的内存,然后将这些指针分别分配到堆上。字符串将分配给SOH,其对象引用由类的实例持有;字节数组将被分配到LOH上,因为它大于85 KB
SOH可以被压缩,其中不会有碎片,而LOH可以在内存中有碎片
问候。我建议您通过C#阅读
CLR--Jeffrey Richter,以获得更好的洞察力
class MyClass
{
string Test="Hello world Wazzup!";
byte[] data=new byte[86000];
}