重用一个变量但是进程释放的内存被认为是内存泄漏?

时间:2018-05-26 14:50:41

标签: memory-management vala

在Vala中,我从作为类的私有变量创建的TreeMultiMap库中获得Gee。当我使用树多图并用数据填充时,该过程的内存消耗增加到14.2 MiB。当我清除仍然是同一个变量并再次使用它的树多图时,但是向它添加较少的数据时,该过程的内存消耗不会增加,但它也不会减少。它保持在14.2 MiB。

代码如下 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

编译

这被认为是内存泄漏吗?如果是这样,有没有办法正确处理这种情况,例如一旦树多图被清除,即使涉及使用其他数据结构,内存也会被释放到操作系统?

我使用了valgrind,但无法检测到任何内存泄漏。我的看法是,一旦为TreeMultiMap变量分配了内存,除非变量超出范围,程序将保持分配的内存直到其生命周期结束,而不是将其释放回操作系统。即使TreeMultiMap被清空。

1 个答案:

答案 0 :(得分:3)

这与Vala关系不大,而与UNIX程序处理内存的方式有关。

当程序启动时,UNIX内核为程序本身,堆栈和称为堆的区域分配内存,其中内存可以由程序动态分配。从UNIX内核的角度来看,堆是一大块内存,程序可以使用sbrk请求更多内容。

在C和大多数其他语言中,您经常需要一小块内存。因此,C标准库有一个代码可以通过mallocfree进行内存分配。使用malloc分配内存时,它会将其从堆中的可用空间中取出。当您free时,它可以在以后的malloc中重复使用。如果没有足够的内存,malloc将调用sbrk以获得更多内存。无论你有多少空闲,C标准库都不会在程序结束之前将内存返回给内核。

Valgrind和Vala正在讨论malloc没有free的内存泄漏问题。 pstop查看sbrk分配的总内存。

这意味着如果你malloc有一大块内存,那么free它,Valgrind会将它显示为正确释放并且它可供你的程序重用,但内核仍然认为它在由程序使用。