我正在运行此代码:
#include <iostream>
#include <cstddef>
int main(int argc, char *argv[]){
int a1=0, a2=0;
int a3,a4;
int b1=++a1;
int b2=a2++;
int*p1=&a1;
int*p2=&++a1;
size_t st;
ptrdiff_t pt;
int i=0;
while(true){
printf("i: %d",i++);
}
printf("\n\ni now is: %d\n",i);
return 0;
}
为什么我会观察到图像内存(fiolet)的减少: 图例:
我做了这个通用的Win32项目,而不是CLR。 我改变了代码,所以我会看到int最终变成负数。现在while()是:
int i=0;
while(0<++i){
printf("i: %d",i++);
}
printf("\n\ni now is: %d\n",i);
奇怪的是:请看看30000次迭代后发生的事情。为什么我们在图像内存中看到这些波动?我现在可以看到,这可能与VMMap本身有关,因为只有当我选择“启动和跟踪新进程”而不是“查看正在运行的进程”并指向从VS2010运行的exe时才会发生这种情况。这是“已启动和跟踪”流程的屏幕:
我还观察到内存的大量分页,这大致开始于图像的下降(这种分页几乎加速并快速触发RAM限制,我已设置为2GB): 这是一个只有“查看”的运行进程(从VS2010运行):
所以也许有些问题会受到.NET应用程序内存管理的影响吗? 我还在等待我的int跨越两个补语。
嗯......我必须再次编辑:事实证明,正如之前所想的那样 - 当只查看(未启动)进程时,会出现内存图像效果下降的情况。下面是10分钟后相同过程的附图(仍在等待将int变为负数):
这里是:
所以我机器上最大的正2补码是2 147 483 647 最小的负数是-2 147 483 648,这很容易验证:
#include <limits>
const int min_int = std::numeric_limits<int>::min();
const int max_int = std::numeric_limits<int>::max();
它给了我相同的结果:-2 147 483 648和2 147 483 647
回到开头 当我评论除while()循环之外的所有内容时 - 同样的事情发生了:在进程运行大约10分钟后,图像正在减少,因此导致这种情况的不是无用的代码。但是什么?答案 0 :(得分:3)
工作集很大程度上受操作系统的控制。您的代码所做的只是在决定是否增长或修剪工作集时考虑的因素。其他因素包括您的应用程序是否位于前台,它的活动程度,堆算法的贪婪程度,因其他进程的需求而存在多少内存压力等。这是设计使然。
Drop可能与Windows选择修剪工作集有关。由于最初加载的大多数代码可能只是用于初始化而不涉及循环,因此操作系统很容易根据LRU算法回收图像页面。
请注意,分配给图像大小的工作集不是唯一被裁剪的部分。