缘起
我在《调试实战 | 记一次有教益的内存碎片转储文件分析》中分析了一个由于内存碎片导致的崩溃转储。发现一个很“奇怪”的现象——程序是 32
位的,但是在查看堆空间大小的时候,居然有将近 4GB
。
相信各位小伙伴儿应该听过下面这种说法:32
位进程有 4GB
的虚拟内存,其中低 2GB
是用户空间,应用程序可以访问,高 2GB
是内核空间,应用程序不能访问,但是内核可以访问。在系统开启 /3GB
的情况下,用户空间可以提升至 3GB
,内核空间被压缩到 1GB
。
这也是我学到的关于 32
位进程虚拟内存相关的知识,但是上述描述不够准确。比如,开启了 /3GB
,进程用户空间就一定可以提升至 3GB
吗?在 64
位系统上,上述说法还成立吗?
带着上述疑问,我翻看了微软官方文档,本文尽可能全面的总结进程的虚拟内存空间划分。因为能力有限,本文只涉及 x86/x64
平台,不涉及 ARM
平台。