新语句如何分配堆内存?

时间:2010-07-16 04:40:58

标签: c# memory memory-management dynamic-memory-allocation

private button btnNew=new button();
btnNew.addclickhandler(this);
private DataGrid grid;
private void onClick(event click) {grid=new DataGrid();}

您好,我编写了一个类似这个示例的代码,我想知道每次用户点击btnNew时,堆和堆栈内存中发生了什么?例如,堆内存中的新块分配给此 grid ?或者更旧的块被删除,这个新块会替换它吗?或者旧的块保留在堆内存中,并且还有新的块分配给它。

这段代码是否会在几次点击时分配大量内存? ** DataGrid可以替换为我想知道的有关此类新语句用法和内存分配的任何组件** 对不起,因为我的英语不好!

4 个答案:

答案 0 :(得分:4)

  

堆的情况如何   并堆叠内存?

因为按钮是引用类型,并且在global中声明将在堆中分配,而不是在堆栈中分配。

  

堆内存中的新块是否已分配给此按钮?

是的,如果内存可用,否则将删除未到达的引用并分配此引用

  

这段代码是否分配了   一个单独的大量内存   点击?

不,但如果你加上千个按钮

,它会

通过Memory in .NET - what goes where查看这篇很酷的文章Jon Skeet,以更好地了解内存的内部结构。

干杯

答案 1 :(得分:2)

这是一个巨大的主题。这类似于询问“您在浏览器中输入www.amazon.com。接下来会发生什么?”要完全回答这个问题,您必须解释整个互联网的架构。要完全回答您的问题,您必须了解现代操作系统的整个内存模型。

你应该首先阅读关于内存和垃圾收集的基本原理,这里:

http://msdn.microsoft.com/en-us/library/ee787088.aspx

然后询问有关您不理解的事情的更具体问题。

答案 2 :(得分:0)

使用new语句在堆上分配内存。通常,分配新内存。如果btnNew指针是与按钮对象关联的唯一指针,它应该成为垃圾收集器的目标。所以内存将再次被释放。对于多次点击,同样会发生,但您应该知道垃圾收集器不能实时工作。因此,在分配大型对象的高频循环中 - “新”可能成为c#中的问题。

答案 3 :(得分:0)

如果button是一个类(ref类型),它将在堆上分配。 (值类型在当前CLR实现中的堆栈上分配,除非它们被另一个引用类型包含或者在闭包中捕获 - 在这种情况下它们在堆上。)。

垃圾收集器预先分配了与第0代,第1代和第2代相对应的不同大小的内存段。当你新建一个对象时,它将在第0代中分配。而且这种分配非常快,因为它只是通过delta =对象的大小移动指针。在执行ctor之前,CLR将对象中的值清除为默认值作为先决条件步骤。

定期暂停所有线程并运行垃圾收集器。它通过遍历“根”创建可到达对象的图形。将丢弃所有无法访问的对象。生成段被移动/压缩以避免碎片。 Gen 0的收集频率高于1,依此类推......(因为Gen-0对象可能是短期对象)。收集后,应用程序线程恢复。

有关详细信息,请参阅解释垃圾收集器和代的文档。这是one