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

您好,我写了一个类似这个示例的代码,我想知道每次用户单击 btnNew 时,堆和堆栈内存中发生了什么?例如,堆内存中的一个新块是否分配给这个网格?或者一个旧的块删除并且这个新块替换它?或者旧块保留在堆内存中并且新块分配给它。

这段代码是否在几次点击时分配了巨大的内存?**DataGrid 可以替换为我想知道的关于这种类型的新语句使用和内存分配的任何组件** 抱歉,我的英语不好!

.

4

4 回答 4

4

堆和堆栈内存发生了什么?

因为按钮是引用类型并在全局中声明,所以将在堆中分配,而不是在堆栈中。

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

是的,如果内存可用,则将删除未访问的引用并分配此引用

这段代码是否一键分配大量内存?

不,但它会,如果你添加一千个按钮

查看这篇很酷的文章Memory in .NET - Jon Skeet在哪里 可以更好地理解内存内部结构。

干杯

于 2010-07-16T04:56:54.207 回答
2

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

您应该从阅读内存和垃圾收集的基础知识开始,这里:

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

然后就你不明白的事情提出更具体的问题。

于 2010-07-16T15:56:33.313 回答
0

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

于 2010-07-16T04:54:42.427 回答
0

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

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

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

有关这方面的更多信息,请参阅说明垃圾收集器和生成的文档。这是一个

于 2010-07-16T04:56:12.150 回答