2010-03-03 245 views
3

在windows操作系统中,堆栈内存是一个线程专有的存储,而调用堆栈是一系列方法的逻辑流程。所以每个线程都有自己的堆栈区域。我想知道堆memroy区域是如何使用的?它是线程特定的吗?过程的具体情况?或者在.NET中,AppDomian特有的?还是在所有用户应用程序和操作系统之间共享?非常感谢。关于堆栈和堆栈内存使用的问题

回答

3

堆是实现动态内存分配的最常见方式。使用堆的典型使用场景包括:在运行时不知道要分配多少内存,或者所需内存太大而无法在堆栈中分配时。

一个进程可以容纳一个或多个堆。大多数流程不止一堆。例如,在Windows中,进程可以具有默认进程堆,CRT堆,并且应用程序可以调用Windows API来创建自己的堆(使用API​​ HeapCreate)。

当一个进程被创建时,操作系统将为它创建一个名为Default Process Heap的新堆,这在大多数情况下实际上很少使用。当我们调用new/delete和malloc/free时,我们实际上正在使用CRT堆。

Windows使用一些复杂的数据结构和算法来确保堆中的内存分配/重新分配和管理是有效的。然而,共同的事实是,在堆中分配内存可能比在堆栈中慢得多。

欲了解更多详细信息,您可以通过C/C++阅读Jeffrey Richter的伟大书籍Windows。并且您可以阅读Here以便快速了解如何在Windows内部管理堆。

1

一些背景:heap通常用于保存在程序执行期间动态分配的内存。相比之下,stack上的内存通常仅用于单个函数调用的生命周期 - IE,当函数返回时,内存不再使用。

每个进程都有自己的一组虚拟内存,所以不同的进程有自己的私有堆栈。

该进程中的线程共享同一个内存池(堆),因此需要注意确保一个线程不“损坏”另一个线程的内存。

多个AppDomain可以在单个进程中运行,但每个AppDomain都有自己的一组数据,因此也有自己的堆。

+0

删除从我的回答实际内存限制隔离我的应用程序,因为它们不是问题的关键... – 2010-03-03 03:54:19

1

“多个应用程序域可以在单个进程中运行,但每个应用程序域都有自己的一组数据,因此也有自己的堆。”

你确定贾斯汀,我与加载另一个DLL到一个单独的应用程序域并执行它,然后定期报告的内存使用一个简单的命令行应用实验。

独立DLL中的代码被设计为逐渐消耗内存。

结果是,consol应用程序报告在其自己的应用程序域中分配的数量增加,直到由于在单独的应用程序域下单独的DLL中运行的线程上的内存不足异常而导致整个批次被减少。

在运行.NET 2的32位XP SP3机器上观察到此行为,并且会声明单独的AppDomain共享相同的进程堆。

如果这不是别人的经验,我很想知道如何从有毒的DLL