- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
MyObject obj = new MyObject();
我知道“new”关键字将调用构造函数并初始化托管堆中的对象。
我的问题是 CLR 如何执行以下操作。
最佳答案
创建引用类型(类、委托(delegate)、接口(interface)、字符串或对象)时,它会分配到堆上。网络有四种不同的堆:(gen0, gen1, gen2)(小对象堆)和 LOH (大对象堆)。 85k 或更小的所有内容都放在前三个堆之一中,具体取决于创建时间(从 gen0 移动到 gen1 再到 gen2,等等)。大于 85k 的对象被放置在 LOH 上。 LOH 永远不会被压缩,所以最终,我正在执行的类型分配最终会导致 OOM 错误,因为对象分散在该内存空间中。这些被称为托管堆。
要创建一个对象,你需要做的就是使用new关键字; .NET 将负责创建、初始化对象并将其放置在正确的堆上,并保留任何必要的额外内存。之后您几乎可以忘记该对象,因为您不必在用完它后将其删除。
当你使用 new 关键字创建一个引用类型对象时,它被放置在堆上,它的引用主要在当前运行的堆栈中使用。还有其他可能的来源,您的对象可以用作引用:
这 5 个实际上是形成对象引用层次结构的 GC 根节点。想象一下经典的 Customer 类,它通常有一个存储 Order 类的集合。当一个 Order 被添加到订单集合中时,集合本身就会持有对添加的订单的引用。如果 Customer 类的实例也有对它的堆栈引用。
这就是复杂对象层次结构的形成方式,这就是 GC 查看引用的方式。
例如:客户对象的堆栈引用 -> 订单列表对象的引用 -> 引用单个订单。
任何来自这 5 个根的松散引用都容易发生 GC。
如何将内存分配给对象有点复杂,它通常随着时间的增长而增长,如指定的 MKK http://msdn.microsoft.com/en-us/magazine/cc163791.aspx
一个简单的例子可以是:
class MyClass
{
string Test="Hello world Wazzup!";
byte[] data=new byte[86000];
}
很容易假设分配时 MyClass 的大小包括:
• 19 个字符
• 86,000 字节。
事实上,对象的大小将只包括一般类的东西,以及存储指向字符串和字节数组(类级别变量)的对象指针所需的内存,然后将它们单独分配到堆上。该字符串将分配在 SOH 上,其对象引用由类的实例持有;字节数组将分配到 LOH,因为它大于 85 KB。
SOH可以压缩,不会有碎片,而LOH在内存中可以有碎片。
问候。
关于c# - 当我给 MyObject obj = new MyObject() 时发生了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11027155/
我对 PHP 中的对象克隆有疑问。我知道克隆创建了一个“深拷贝”,因为创建了一个新对象,其变量初始化为克隆它的对象中相应变量的值。然而,as discussed here ,这意味着任何引用变量都将引
我有一个有点难以解释的合法 JS 问题。请原谅我莫名其妙的说话方式,努力把握大意。 :P 在 JS 中对象可以有属性。您可以将功能分配给属性。您可以重新定义对象的属性而不改变其其他属性。 var my
我有这种情况,我在 C# 中使用的 web 服务方法返回一个业务对象,当使用以下代码调用 web 服务方法时,我在引用中得到异常“无法将类型为 ContactInfo 的对象转换为类型 Contact
我试图进入在 ScalaDays 2013 上展示的新 Scala Pickling 库:Scala Pickling 我真正缺少的是一些如何使用库的简单示例。 我明白我可以像这样腌制一些物体并再次解
这个问题已经有答案了: Which is more effective: if (null == variable) or if (variable == null)? [duplicate] (9
这行代码做了什么? MyObject *objectOne = (MyObject *)recognizer.view; 我对 (MyObject *) 感到困惑。 它是否有效地将 recognize
我遇到了一个具有不可变属性的类: MyObject[] allObjs 属性初始化如下: List objs = createAllMyObjects(); allObjs = objs.toArra
这是我的代码: Set> mySet = getSetOf(MyObject.class); public Set getSetOf(Class setClass) { Set set =
我在面试时被问到这个问题。不能使用 Google Guava 或 MultiMap。我有课 public class Alpha { String company; int loc
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Sorting a collection of objects Sorting an ArrayList of Co
我想根据对象属性对 ArrayList 中的一些对象进行排序。该对象具有: public class Minterm { String minTerm; char flagTick;
这个比那个好吗? 这甚至是一个有效的问题吗? 我最近被告知 MyObject.DoSomething()已经过时了,服务方式是首选。那正确吗? 例子: public class Policy : IC
这个问题在这里已经有了答案: Why can't assign I to ? (2 个答案) What are the risks of explicitly casting from a lis
MyObject obj = new MyObject(); 我知道“new”关键字将调用构造函数并初始化托管堆中的对象。 我的问题是 CLR 如何执行以下操作。 CLR 如何执行上述行? CLR 如
如何转换 Flux直接到Mono> ? 我正在寻找相当于 Single> single = observable.toList()来自 RxJava。 使用阻塞运算符,我可以这样做: val just
在我的 Scalding Flow 中,我有一个 TypedType[Set[MyObject]]。如何将其展平为 TypedType[MyObject]? 最佳答案 pipe.flatMap(ide
我有很多 resharper 警告将我的参数从常规数组更改为相同类型的 IEnumerable,所以它会改变这个: public Interface IGenerator { voi
存储 Collection 的最佳方式是什么? ?该集合对于当前用户来说实际上是静态的。每个用户只能看到他们的 Collection 。 MyItem项目工具 IItem : public inter
我目前正在练习/学习 Ruby 中的单例方法和单例类,我遇到了一个疑问。鉴于: myobject = Object.new 这样做有什么区别吗: def myobject.mymethod end 然
类似于this question但使用对象而不是指针。 如果我有如下代码 Foo f; vector vect; vect.push_back(f); vect.erase(vect.begin())
我是一名优秀的程序员,十分优秀!