2012-06-11 70 views
7

我運行這段代碼:內存映像下降

#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

我也觀察到的記憶巨大的分頁,這與該下降的圖像(該尋呼近加快並迅速引發內存的限制大致開始,我已設置爲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 14 7 483 648和2 147 483 647

回到開始 當我評論一切,但while()循環 - 同樣的事情發生:圖像正在減少後,進程運行約10分鐘,所以它不是無用的導致這種情況的代碼。但是什麼?

+0

你可以一遍又一遍地重現這種內存消耗模式嗎? – dirkgently

+1

也許printf日誌佔用一些圖形空間? –

+0

這是怎麼可能,該圖像descresing? @dirkgently,到目前爲止,這仍然是運行,因爲我想看看int最終會是什麼時候 – 4pie0

回答

3

工作集很大程度上受操作系統的控制。您的代碼在決定是否增加或減少工作集時只會考慮一個因素。其他因素包括您的應用程序是否處於前臺,它的活躍程度,堆算法的貪婪程度,由於其他進程的需求而存在多少內存壓力等等。這是設計。

滴可能與Windows選擇修剪您的工作集有關。由於大部分最初加載的代碼可能只是用於初始化,並且不涉及循環,因此操作系統很容易根據LRU算法回收圖像頁面。

請注意,分配給圖像大小的工作集不是唯一被修剪的部分。

+0

是的,堆也被修剪。爲什麼堆?這個巨大的分頁的原因是什麼,最後踢了VMMap的?它發生得非常快,大約10分鐘。 – 4pie0

+0

只有在VMMap中啓動進程時,纔會出現分頁,而不是在選擇「查看正在運行的進程」時觀察到的頁面 – 4pie0

+0

當我評論所有內容但while()循環發生同樣的事情時:頁面正在運行大約10分鐘 – 4pie0