Повторное использование переменной, но процесс не освобождает память, считается утечкой памяти? - PullRequest
0 голосов
/ 26 мая 2018

В Vala у меня есть TreeMultiMap из библиотеки Gee, созданной как закрытая переменная класса.Когда я использую дерево multi map и заполняю его данными, потребление памяти процессом увеличивается до 14.2 MiB.Когда я очищаю древовидную мультикарту, которая остается той же самой переменной, и использую ее снова, но добавляю к ней меньше данных, потребление памяти процессом не увеличивается, но и не уменьшается.Он остается на уровне 14,2 МБ.

Код выглядит следующим образом: MultiMapTest.vala

using Gee;

private TreeMultiMap <string, TreeMultiMap<string, string> > rootTree;

public static int main () {
    // Initialize rootTree
    rootTree = new TreeMultiMap<string, TreeMultiMap<string, string> > (null, null);

    // Add data repeatedly to the tree to make the process consume memory
    for (int i = 0; i < 10000; i++) {
        TreeMultiMap<string, string> nestedTree = new TreeMultiMap<string, string> (null, null);
        nestedTree.@set ("Lorem ipsum", "Lorem ipsum");
        rootTree.@set ("Lorem ipsum", nestedTree);
    }

    stdout.printf ("Press ENTER to clear the tree...");
    // Wait for the user to press enter
    var input = stdin.read_line ();

    // Clear the tree
    rootTree.clear ();

    stdout.printf ("Press ENTER to continue and refill the tree with less data...");
    // Wait for the user to press enter
    input = stdin.read_line ();

    // Refill the tree but with much less data
    for (int i = 0; i < 10; i++) {
        TreeMultiMap<string, string> nestedTree = new TreeMultiMap<string, string> (null, null);
        nestedTree.@set ("Lorem ipsum", "Lorem ipsum");
        rootTree.@set ("Lorem ipsum", nestedTree);
    }

    stdout.printf ("Press ENTER to quit...");
    // Wait for the user to press enter
    input = stdin.read_line ();
    return 0;
}

Скомпилировано с valac --pkg gee-0.8 -g MultiMapTest.vala

Считается ли этоутечка памяти?Если это так, есть ли способ правильно подходить к ситуации, например, когда память освобождается для ОС после очистки дерева multi-map, даже если оно предполагает использование других структур данных?

Я использовал valgrind, но не смогобнаружить любые утечки памяти.Я полагаю, что после выделения памяти для переменной TreeMultiMap, если переменная не выйдет из области видимости, программа сохранит эту память до конца своего срока службы вместо того, чтобы возвращать ее обратно операционной системе.Даже если TreeMultiMap опустошен.

1 Ответ

0 голосов
/ 26 мая 2018

Это имеет мало общего с Vala, и больше связано с тем, как программы UNIX работают с памятью.

Когда программа запускается, ядро ​​UNIX выделяет память для самой программы, стека и областиназывается кучей, где память может быть динамически выделена программой.С точки зрения ядра UNIX, куча - это большой кусок памяти, и программа может запросить больше, используя sbrk.

. В C и большинстве других языков вам часто требуются небольшие куски памяти.Итак, в стандартной библиотеке C есть код для выделения памяти через malloc и free.Когда вы выделяете память, используя malloc, она забирает ее из свободного места в куче.Когда вы free это, он может быть использован позже malloc.Если памяти недостаточно, malloc вызовет sbrk, чтобы получить больше памяти для программы.Независимо от того, сколько вы освободите, стандартная библиотека C не будет возвращать память ядру, пока программа не завершится.

Valgrind и Vala говорят об утечках памяти, когда вы malloc без free.ps или top см. Общий объем памяти, выделенный sbrk.

Это означает, что если у вас malloc большой кусок памяти, тогда free его, Valgrind покажет его как правильноосвобожден и доступен вашей программе для повторного использования, но ядро ​​все еще считает его используемым программой.

...