CLR会通过VirtualAlloc预先提交整个栈,提交之后就立即占用物理空间(物理内存或磁盘)。也许你会发现查看内存占用的时候看起来并没有占用那么多内存,那是因为线程栈一般很少用到1M内存的全部,提交内存在未被使用之前并不会真正分配。看看我的内存截图:
提交数内和已用内存并不相等,因为很多提交内存并未真正分配出去。
那是不是就真的不占用内存了?看下面有看了3000个线程,在继续加就OutOfMemory了。
看以看出虽然并没有使用完物理内存,但将物理内存“预订“下了,这块物理内存也无法干其他用了。
看以看到真实分配了1G内存,而工作集只有56M。
在这儿看来分配磁盘虚拟物理内存也是很有必要的,想我这样完全关闭磁盘虚拟地址就很大程度的浪费内存了。
在做full dump的时候dump文件往往要比实际Working Set 大,有时候出奇的大很多,尤其线程数多的进程,dump完了后内存占用也蹭的涨起来了,我想可能是dump了整个已提交地址空间。
就算64下虚拟地址空间足够用,但物理地址空间是很有限的,还得控制一下提交量啊,别占着茅坑不拉屎,明明有内存还OutOfMemory。。。