总是被朋友问,用 !address -summary
显示出上面的 Free ≈ 128T
到底是什么意思?我的空闲内存不可能有这么大,不管怎么说,先上命令。
0:009> !address -summary--- Usage Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
Free 58 7ffe`d6410000 ( 127.995 TB) 100.00%
<unknown> 65 1`22935000 ( 4.540 GB) 97.59% 0.00%
MappedFile 15 0`031e9000 ( 49.910 MB) 1.05% 0.00%
Image 194 0`02d03000 ( 45.012 MB) 0.94% 0.00%
Stack 30 0`00dc0000 ( 13.750 MB) 0.29% 0.00%
Heap 17 0`0040d000 ( 4.051 MB) 0.09% 0.00%
Other 8 0`001dd000 ( 1.863 MB) 0.04% 0.00%
TEB 10 0`00014000 ( 80.000 kB) 0.00% 0.00%
PEB 1 0`00001000 ( 4.000 kB) 0.00% 0.00%--- Type Summary (for busy) ------ RgnCount ----------- Total Size -------- %ofBusy %ofTotal
MEM_PRIVATE 124 1`23b09000 ( 4.558 GB) 97.97% 0.00%
MEM_MAPPED 22 0`033d4000 ( 51.828 MB) 1.09% 0.00%
MEM_IMAGE 194 0`02d03000 ( 45.012 MB) 0.94% 0.00%--- State Summary ---------------- RgnCount ----------- Total Size -------- %ofBusy %ofTotal
MEM_FREE 58 7ffe`d6410000 ( 127.995 TB) 100.00%
MEM_RESERVE 55 1`24c09000 ( 4.574 GB) 98.32% 0.00%
MEM_COMMIT 285 0`04fd7000 ( 79.840 MB) 1.68% 0.00%--- Protect Summary (for commit) - RgnCount ----------- Total Size -------- %ofBusy %ofTotal
PAGE_READONLY 108 0`02906000 ( 41.023 MB) 0.86% 0.00%
PAGE_EXECUTE_READ 32 0`020b4000 ( 32.703 MB) 0.69% 0.00%
PAGE_READWRITE 101 0`005aa000 ( 5.664 MB) 0.12% 0.00%
PAGE_WRITECOPY 24 0`0002b000 ( 172.000 kB) 0.00% 0.00%
PAGE_EXECUTE_READWRITE 10 0`00028000 ( 160.000 kB) 0.00% 0.00%
PAGE_READWRITE | PAGE_GUARD 10 0`00020000 ( 128.000 kB) 0.00% 0.00%--- Largest Region by Usage ----------- Base Address -------- Region Size ----------
Free 1`40006000 7ff3`bde7a000 ( 127.952 TB)
<unknown> 7ff4`fdf80000 1`00020000 ( 4.000 GB)
MappedFile 0`22fc0000 0`01a07000 ( 26.027 MB)
Image 7ffc`16c04000 0`008ca000 ( 8.789 MB)
Stack 0`006d0000 0`0017c000 ( 1.484 MB)
Heap 0`22c3c000 0`00101000 ( 1.004 MB)
Other 0`00d50000 0`00181000 ( 1.504 MB)
TEB 0`00270000 0`00002000 ( 8.000 kB)
PEB 0`0026f000 0`00001000 ( 4.000 kB)
从上面输出看,当前空闲空间是Free=127.995 T
,那这是什么意思呢?这要从 地址总线
说起, CPU 从内存中拿数据需要走 地址总线
,1个地址线可以传递 1/0
两个状态,16根总线就可以同时传递16个 1/0
状态,也就可以拥有 2 的 16 个地址个数,地址范围是 0x00000000 - 0xffffffff
,比如 0x005aa000
就是这范围中的一个。
有了这个基础,再回过头来看下,目前很多的机器,数据总线是 64 根,但地址总线只有 48 根,能表示的地址个数就是 2 的 48次方,也就是 256T,当然这是理论上的最大可寻址空间,而用户区大概占用一半,也就是 128T,不过这已经足够覆盖现如今大家用的 内存条大小 了。