进程内存 vs 应用程序域内存分配

4
假设我有一个创建了三个域:DomainA、DomainB和DomainC的.Net应用程序App.exe。
我们可以说CLR为App.exe进程分配一定量的物理内存,然后将这个内存按比例分配给我们的三个域吗?
或者对于每个新域,都会独立地提供新的内存部分,而不考虑为App.exe和其他域分配的内存?
简单来说:我能把逻辑内存分配想象成一个(顺序)带有歌曲的磁带(其中歌曲是AppDomans),还是一种FAT32,文件随机分布,我们只知道它们在磁盘上的位置?
2个回答

6
我们不能说CLR分配了一定数量的物理内存给App.exe进程。在Windows上,进程只分配虚拟内存,将虚拟内存映射到物理内存(RAM)是操作系统的职责。RAM需要动态地被所有正在运行的进程共享。所有进程的虚拟内存分配总和通常远远超过RAM的总量。当一个进程访问虚拟内存时,会发生页错误并将虚拟内存页面映射到RAM上。如果需要,RAM中的数据将被丢弃或存储在分页文件中以腾出空间。
App域共享一组GC堆(第0到2代和大对象堆),它们的分配是交错进行的。它们通过它们的根保持分开,每个App域都有其自己的静态变量堆、自己的GCHandles和自己的一组带有本地变量的线程堆栈帧。

2
整个由CLR管理的内存都是进程全局的,AppDomains在这里没有作用。无论您有多少个AppDomains,分配总是来自相同的全局堆(堆会根据需要扩展和收缩)。没有静态内存分配。
我认为JVM使用静态分配来设置堆大小,原因我不知道。CLR是不同的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接