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