射击......
你在4GB的杏,但你有24GB物理内存。 4GB是32位进程在64位Windows操作系统上的最大用户地址空间量。尝试将程序明确作为64位进程运行。我的直觉是它作为一个32位进程运行。
VS:项目属性 - >建设 - >目标平台:64
更新
我的平台设置为64后,我的系统上下面的代码超过4GB的工作集。由于我在6GB内存的系统上进行测试,并没有得到太多的提示,并且内存不足以超过〜4.2GB。我确实有一台内存为24GB的服务器,但我不愿意为此测试软管它! :)
我猜您的评论时,你说你在你的系统,你的程序上看到12GB内存的使用,这是总虚拟内存的使用,而不是物理内存使用。 PeakWorkingSet64指的是物理内存。
我已经把几个小提琴在代码,以确保生成的数据正在被触摸,使得其保持是热的和在物理内存中,而不是调出(不包括在工作集的数字,因为它是在换出存储器分页文件,而不是实际的物理内存)。如果没有被触摸,Windows会积极地将内存分页到磁盘。
Console.WriteLine("Is64=" + (Marshal.SizeOf(IntPtr.Zero) == 8));
Process p = Process.GetCurrentProcess();
List<int[]> data = new List<int[]>();
while (true)
{
int[] buffer = new int[1024 * 1024 * 128]; //<- 0.5GB
data.Add(buffer);
int touch = 0;
foreach (var b in data)
{
for (int i = 0; i < b.Length; i++)
{
touch += b[i];
}
}
p.Refresh();
int mb = (int)(p.PeakWorkingSet64/(float)1024/1024);
Console.WriteLine("ignore" + touch);
Console.WriteLine(mb + "MB");
Thread.Sleep(1 * 1000);
}
输出:
ignore0
524MB
ignore0
1055MB
ignore0
1560MB
ignore0
2074MB
ignore0
2587MB
ignore0
3101MB
ignore0
3615MB
ignore0
4132MB
ignore0
4188MB
重要提示
请确保使用PeekWo过程rkingSet64是一个64位的进程。令我惊讶的是,即使被监控进程是64位并拥有比此更多的物理内存,试图获得另一个64位进程的PeekWorkingSet64的32位进程也只能获得4096MB的最大内存使用量。
我知道你说过不要问,但是12GM是什么?你对12GM有什么期待? –
你有多少物理记忆? –
24GB :)物理内存 – Noam