2013-08-30 85 views
2

假設我有.Net應用程序App.exe,它會創建三個域:DomainA,DomainB和DomainC。進程內存v.s. AppDomain內存分配

我們可以說CLR爲App.exe分配了一定數量的物理內存,然後這個內存在我們三個域之間按一定比例分配了嗎?

或者對於每個新域,內存的新單獨部分是獨立於爲App.exe和其他域分配的內存而給出的?簡而言之:我可以將邏輯內存分配想象爲一個帶有歌曲(其中歌曲是AppDomans)的(順序)磁帶,或者作爲一種FAT32,其中文件隨機定位並且我們只知道它們在磁盤上的位置?

回答

6

,我們可以說,CLR分配給APP.EXE過程的物理內存一定量

你不能說,Windows上的程序只分配虛擬內存。虛擬內存到物理內存(RAM)的映射是操作系統的責任。 RAM需要被機器上運行的所有進程共享,並且是動態完成的。所有進程的虛擬內存分配總和通常大大超過RAM的數量。當進程訪問虛擬內存時,頁面錯誤會將虛擬內存頁面映射到RAM。如有必要,RAM中的數據將被丟棄或存儲在分頁文件中以騰出空間。

AppDomains共享一組GC堆(0到2代和大對象堆)並將它們的分配混合在一起。它們彼此分開,每個AppDomain都有自己的靜態變量堆,它自己的GCHandles以及它自己的帶局部變量的線程堆棧幀。

2

由CLR管理的整個內存是全局進程。 AppDomain在這裏不起作用。無論您擁有多少AppDomains,分配總是來自相同的全局堆(s)。堆根據需要擴展和縮小。沒有靜態的內存分配。

我相信JVM確實使用靜態分配堆大小的原因是我不知道的。 CLR是不同的。