2013-05-07 31 views
0

假設我有一臺運行在8Gb內存的機器上的Linux(64位,內核2.6,glibc 2.4)操作系統。所有引用的程序都是C實現。另一個程序是否有可能重新使用一次分配的空閒內存,以及是否已被其他正在運行的程序釋放?

程序A啓動並假設它分配(並寫入信息)5 Gb的內存(做malloc)。在此之後,它將釋放所有預先分配的內存。這意味着我們有一個過程曾經使用5Gb的內存加載到內存中,現在運行的內存使用率非常低。

雖然程序A仍在運行,並且沒有使用內存,但我啓動了另一個同一程序(我稱爲程序B)的實例,試圖分配5Gb的內存。

我正在觀察的是,程序B無法保留所有的內存,操作系統開始交換,儘管理論上它應該有足夠的可用RAM。結論是程序A爲自己的未來使用保留了5Gb的RAM,並且它不能用於任何其他程序。

從OS或任何其他需要分配大量內存的程序的角度來看,程序釋放的內存會發生什麼?有沒有辦法迫使操作系統釋放這個內存而不停止程序A?

對不起,過於簡單化。

在此先感謝!

PS:使用的代碼是類似於:

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <math.h> 

int main(int argc, char** argv) { 
    int max = -1; 
    int mb,x = 0; 
    char* buffer[1000]; 

    if(argc > 1) 
     max = atoi(argv[1]); 

    while((buffer[mb]=malloc(50*1024*1024)) != NULL && mb != max) { 
     memset(buffer[mb], 0, 50*1024*1024); 
     mb++; 
     printf("Allocated %d Mem Blocks, totalling %d\n", mb,mb*50); 
     sleep(1); 
     if((mb%15)==0) 
    { 
     for(x=0;x<5;x++) 
     { 
     mb--; 
       free(buffer[mb]); 
      printf("Allocated %d Mem Blocks, totalling %d\n", mb,mb*50); 
      sleep(2); 
     } 
    } 
    } 

    return 0; 
} 
+0

更多信息:我一直在向需要更多信息的同事問題。似乎他沒有告訴我他正在使用JNI從JAVA程序進行調用,所以這完全改變了這種情況。也許是JNI的問題。 我會盡量在接下來的幾天內測試這種情況。 對不起:( – toje 2013-05-07 15:47:48

回答

0

在linux中我們使用該命令來釋放內存和髒高速緩存..

同步; echo 3>/proc/sys/vm/drop_caches

希望這將有助於釋放未被使用的內存。

2

有關說明,請參閱Will malloc implementations return free-ed memory back to the system?。如果實際上對二進制進行了壓縮,即使調用free(),您也會看到內存使用mmap()分配,但未釋放。

要求是free()將內存回送給進程,而不是OS。使用glibc,你可以調用malloc_trim(),但是這隻適用於sbrk()分配的內存,而不是如果分配滿足使用mmap()

+0

)你連接(部分)不同意你的問題,說大的分配返回。 – 2015-03-17 00:37:54

相關問題