簡體   English   中英

為什么即使釋放了內存,使用的內存量也會增加?

[英]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操作后,已用內存量應恢復到以前的值。 使用的內存量與操作員newdelete的電話號碼有關。

具有一百萬個DOUBLE值,僅有效負載所需的內存量為8 MB。 您的照片顯示私人使用量沒有增加那么多,這實際上是正確釋放了內存。

但是,您沒有考慮的是, new不會從裸內存中進行分配,它會從堆中獲取塊,並且當它們返回時,它們仍可能(在某種程度上)屬性來處理等待“緩存”的新分配。

這就是您所看到的:隨着分配/取消分配的大量增加,內存使用量僅增加了一點。 通過一百萬個小的分配,它增加了更多,但仍然遠遠小於實際有效負載大小。 如果重復分配,您會發現在某些時候內存不會進一步增加,您看到的所有剩余內容都是碎片和堆分配工件。

我希望額外的內存實際上與這里使用的堆數量沒有直接關系。 這可能是一些額外的內存管理開銷和類似的開銷,而不是實際的內存分配。 正如羅曼指出的那樣,您正在分配8MB,這遠遠超出了打印輸出中的很小差異。 取而代之的是,當您分配許多小塊時,將使用更多開銷來跟蹤內存分配,在第二種情況下,這將占用更多內存。 當然,該內存並不直接屬於您的分配,因此當釋放實際內存時,實際上並不會因此釋放它。

我將其歸結為“按原樣” ...

我希望如果分別運行test1和test2 50次,則內存使用率在某個時候不會繼續上升-可能不會立即發生,但是經過幾次運行,它將達到“穩定狀態”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM