假设我有.Net应用程序App.exe,它创建了三个域:DomainA,DomainB和DomainC。
我们可以说CLR会为App.exe进程分配一些物理内存,然后这个内存在我们的三个域之间分成一定比例吗?
或者对于每个新域,一个新的独立内存部分是独立于为App.exe和其他域分配的内存而给出的?
简单来说:我可以将逻辑内存分配视为带有歌曲的(顺序)磁带(其中歌曲是AppDomans),或者作为一种FAT32,其中文件随机定位,我们只知道它们在磁盘上的位置? / p>
答案 0 :(得分:6)
我们可以说CLR会为App.exe进程分配一些物理内存
你不能这么说,Windows上的进程只分配虚拟内存。虚拟内存到物理内存(RAM)的映射严格来说是操作系统的职责。 RAM需要由机器上运行的所有进程共享,并且是动态完成的。所有进程的虚拟内存分配总和通常大大超过RAM的数量。当进程访问虚拟内存时,页面错误会将虚拟内存页面映射到RAM。如有必要,RAM中的数据将被丢弃或存储在页面文件中以腾出空间。
AppDomains共享一组GC堆(第0代到第2代以及大对象堆)并且它们的分配是混合的。它们的根源分开,每个AppDomain都有自己的静态变量堆,它自己的GCHandles和它自己的一组带有局部变量的线程堆栈帧。
答案 1 :(得分:2)
CLR管理的整个内存是进程全局的。 AppDomains在这里不起作用。无论您拥有多少AppDomain,分配始终来自相同的全局堆。堆根据需要扩展和缩小。没有静态的内存分配。
我认为JVM确实对堆大小使用静态分配,原因我不知道。 CLR是不同的。