记忆影像减少

我正在运行此代码:

#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

上一篇: memory image decrease

下一篇: Google analytics with multiple subdomains