关于堆的问题&堆栈内存使用情况

时间:2010-03-03 02:45:59

标签: c# .net operating-system

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

3 个答案:

答案 0 :(得分:3)

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

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

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

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

有关更多详细信息,您可以阅读Jeffrey Richter的伟大着作 Windows via C / C ++ 。您可以阅读Here以快速了解如何在Windows内部管理堆。

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:1)

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

你确定Justin,我已经尝试了一个简单的命令行应用程序,它将另一个DLL加载到一个单独的应用程序域中并执行它,然后定期报告内存使用情况。

单独DLL中的代码旨在逐渐消耗内存。

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

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

如果这不是其他人的经验,我很想知道如何将我的应用程序与有毒的DLL隔离