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