2013-08-30 47 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是不同的。