代码之家  ›  专栏  ›  技术社区  ›  user2341923

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

  •  4
  • user2341923  · 技术社区  · 11 年前

    假设我有.Net应用程序App.exe,它创建了三个域:DomainA、DomainB和DomainC。

    我们可以说CLR为App.exe分配了一定数量的物理内存,然后这些内存在我们的三个域之间按一定比例分配吗?

    或者对于每个新域,独立于为App.exe和其他域分配的内存,提供一个新的单独内存部分?

    简单地说:我能把逻辑内存分配想象成一个包含歌曲的(顺序)磁带吗(歌曲是AppDomans),或者想象成一种FAT32,其中文件随机定位,我们只知道它们在磁盘上的位置?

    2 回复  |  直到 11 年前
        1
  •  6
  •   Hans Passant    11 年前

    我们可以说CLR为App.exe进程分配了一定数量的物理内存吗

    你不能这么说,Windows上的进程只分配 事实上的 记忆力虚拟内存到物理内存(RAM)的映射严格来说是操作系统的职责。RAM需要由机器上运行的所有进程共享,并且是动态完成的。所有进程的虚拟内存分配之和通常大大超过RAM的数量。当进程访问虚拟内存时,页面故障会将虚拟内存页面映射到RAM。如有必要,RAM中的数据将被丢弃或存储在分页文件中以腾出空间。

    AppDomains共享一组GC堆(第0代到第2代以及大型对象堆),并且它们的分配是混合的。它们通过根进行分隔,每个AppDomain都有自己的静态变量堆、自己的GCHandles和自己的一组带有本地变量的线程堆栈帧。

        2
  •  2
  •   usr    11 年前

    CLR管理的整个内存是进程全局的。AppDomains在此不起作用。不管你有多少AppDomain,分配总是来自同一个全局堆。堆根据需要膨胀和收缩。内存没有静态分配。

    我相信JVM确实对堆大小使用了静态分配,原因我不知道。CLR不同。