记忆影像减少
我正在运行此代码:
#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("nni now is: %dn",i);
return 0;
}
为什么我观察到图像记忆(fiolet)的这种下降: 传说:
我制作了这个通用的Win32项目,而不是CLR。 我更改了代码,所以我会看到int何时变为负数。 现在,while()是:
int i=0;
while(0<++i){
printf("i: %d",i++);
}
printf("nni now is: %dn",i);
奇怪的是:请在30000次迭代后查看发生了什么。 为什么我们在图像存储器中看到这些波动? 我现在可以看到,这可能与VMMap本身有关,因为只有当我选择“启动并跟踪新进程”,而不是“查看正在运行的进程”并指向运行从VS2010启动的exe时,才会发生这种情况。 以下是“启动和跟踪”过程的屏幕:
我还观察到内存的大量分页,这大概是随着图像的下降而开始的(这种分页几乎加速并且很快触发RAM限制,我已经设置为2GB): 这里只是一个正在运行的进程“查看”(从VS2010运行):
所以也许有一些问题需要.NET应用程序的内存管理吗? 我仍然在等待我的整数跨过两个补码的边界。
好吧...我必须再次编辑:事实证明,正如先前的想法 - 只有在观看(未启动)过程时,存在降低的内存图像效果。 下面是10分钟后同样过程的附图(仍然等待将int转成负值):
这里是:
所以我的机器上最大的二次补码是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分钟后,image正在减少,所以它不是无用的代码。 但是什么?
工作集在很大程度上受操作系统的控制。 您的代码在决定是否增加或减少工作集时只会考虑一个因素。 其他因素包括您的应用程序是否处于前台,它的活跃程度,堆算法的贪婪程度,由于其他进程的需求而存在多少内存压力等等。这是设计。
这些滴可能与Windows选择修剪工作集相关。 由于大部分最初加载的代码可能只是用于初始化,并且不涉及循环,因此操作系统很容易根据LRU算法回收图像页面。
请注意,分配给图像大小的工作集不是唯一被修剪的部分。
链接地址: http://www.djcxy.com/p/10843.html