关于虚拟内存

    我们通过VMM(虚拟内存管理器)使用内存;VMM让每一个进程有自己的虚拟地址空间,即使所有的进程共享一个机器的物理内存。如果我们编写托管代码,GC帮助我们分配和释放虚拟内存。

每一个VA(虚拟地址)范围都在三个状态中的一种:空闲,已保留,已提交。空闲我们都能理解,已保留状态表示这块虚拟内存已被分配给请求者,但是对应的物理内存还没有分配。比如你分配了一个10M的字节数组,在你真正用索引器访问之前,如果用TaskManager查看,增加的只是Committed Size,而不是Private Working Set。GC会帮助我们在使用时,自动提交。提交状态表示为对应的虚拟内存分配实际的物理内存。

虚拟内存可是时私有的或者共享的,私有表示只能被当前进程使用,共享表示可以被多个进程使用。所有GC相关的内存都是私有的。

虚拟内存和物理内存之间需要映射;映射的单位是页,大小一般是4KB。分配的时候一般会一次分配多个页(页由多级页索引管理,以及地址映射性能优化是另一个负复杂的话题)

虚拟地址空间可能会碎片化,当你申请一块内存的时候,VMM需要在虚拟地址空间中找到一块足够容纳你请求大小的空闲内存块;当机器上的进程使用的内存超过了物理内存的容量的时候,一些内存页会被写入页文件;这个过程非常缓慢,所以应该尽量避免这种情况。(Windows中我们称之为页文件,Linux中我们称之为交换文件)

一个Windows进程有很多内存使用指标,如下图所示,一般情况下,我们只关心private working set。


Linux中的内存使用指标跟Windows类似,如下图所示,一般情况下,我们只关心private resident。


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容