2010-03-03 106 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