记忆图像减少

时间:2012-06-11 18:37:11

标签: c++ memory-management

我正在运行此代码:

#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)的减少: enter image description here 图例:

enter image description here 我做了这个通用的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时才会发生这种情况。这是“已启动和跟踪”流程的屏幕: enter image description here

我还观察到内存的大量分页,这大致开始于图像的下降(这种分页几乎加速并快速触发RAM限制,我已设置为2GB): enter image description here 这是一个只有“查看”的运行进程(从VS2010运行): enter image description here

所以也许有些问题会受到.NET应用程序内存管理的影响吗? 我还在等待我的int跨越两个补语。

嗯......我必须再次编辑:事实证明,正如之前所想的那样 - 当只查看(未启动)进程时,会出现内存图像效果下降的情况。下面是10分钟后相同过程的附图(仍在等待将int变为负数): enter image description here

这里是:

enter image description here

所以我机器上最大的正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分钟后,图像正在减少,因此导致这种情况的不是无用的代码。但是什么?

1 个答案:

答案 0 :(得分:3)

工作集很大程度上受操作系统的控制。您的代码所做的只是在决定是否增长或修剪工作集时考虑的因素。其他因素包括您的应用程序是否位于前台,它的活动程度,堆算法的贪婪程度,因其他进程的需求而存在多少内存压力等。这是设计使然。

Drop可能与Windows选择修剪工作集有关。由于最初加载的大多数代码可能只是用于初始化而不涉及循环,因此操作系统很容易根据LRU算法回收图像页面。

请注意,分配给图像大小的工作集不是唯一被裁剪的部分。