[英]Why the amount of used memory increases even after the memory is released?
我發現即使在程序中釋放內存后,使用的內存量也會增加。 因此,我編寫了兩個簡單的C ++測試程序來對其進行驗證。
#define NUM 1000000
void Test1()
{
PrintMemory("Test1 Beginning");
double* Data = new double[NUM];
for(int i = 0; i < NUM; i++)
{
Data[i] = std::rand() % 1000;
}
double sum = 0;
for(int i = 0; i < NUM; i++)
{
sum += Data[i];
}
delete [] Data;
PrintMemory("end");
}
double* Data[NUM];
void Test2()
{
PrintMemory("Test2 Beginning");
for(int i = 0; i < NUM; i++)
{
Data[i] = new double;
*(Data[i]) = std::rand() % 1000;
}
double sum = 0;
for(int i = 0; i < NUM; i++)
{
sum += *(Data[i]);
}
for(int i = 0; i < NUM; i++)
{
delete Data[i];
}
PrintMemory("end");
}
void main()
{
Test1();
Test2();
}
在函數PrintMemory
我調用API GetProcessMemoryInfo
以獲取有關已用內存的信息,該信息是結構PROCESS_MEMORY_COUNTERS_EX
的字段PrivateUsage
。
輸出如下:
MemUsed:在Test1開頭的5544kb
MemUsed:最終5568kb
已使用的內存:Test2開頭的5568kb
MemUsed:最終6404kb
我不知道輸出結果。 我希望在調用delete
操作后,已用內存量應恢復到以前的值。 使用的內存量與操作員new
和delete
的電話號碼有關。
具有一百萬個DOUBLE
值,僅有效負載所需的內存量為8 MB。 您的照片顯示私人使用量沒有增加那么多,這實際上是正確釋放了內存。
但是,您沒有考慮的是, new
不會從裸內存中進行分配,它會從堆中獲取塊,並且當它們返回時,它們仍可能(在某種程度上)屬性來處理等待“緩存”的新分配。
這就是您所看到的:隨着分配/取消分配的大量增加,內存使用量僅增加了一點。 通過一百萬個小的分配,它增加了更多,但仍然遠遠小於實際有效負載大小。 如果重復分配,您會發現在某些時候內存不會進一步增加,您看到的所有剩余內容都是碎片和堆分配工件。
我希望額外的內存實際上與這里使用的堆數量沒有直接關系。 這可能是一些額外的內存管理開銷和類似的開銷,而不是實際的內存分配。 正如羅曼指出的那樣,您正在分配8MB,這遠遠超出了打印輸出中的很小差異。 取而代之的是,當您分配許多小塊時,將使用更多開銷來跟蹤內存分配,在第二種情況下,這將占用更多內存。 當然,該內存並不直接屬於您的分配,因此當釋放實際內存時,實際上並不會因此釋放它。
我將其歸結為“按原樣” ...
我希望如果分別運行test1和test2 50次,則內存使用率在某個時候不會繼續上升-可能不會立即發生,但是經過幾次運行,它將達到“穩定狀態”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.