【问题标题】:Hidden memory leaks隐藏的内存泄漏
【发布时间】:2011-05-12 12:46:51
【问题描述】:

一位系统管理员告诉 med,内存泄漏可能是不可见的。即,如果应用程序正在泄漏内存,则应用程序使用的所有内存可能在任务管理器或等效工具中不可见。

他似乎对此非常肯定。我一直认为在任务管理器(或进程资源管理器)等工具中正确显示了所有内存泄漏(不是以字节为单位,而是内存不断增加,直到服务器中没有更多内存)?

他的说法是否正确,如果正确:哪些类型的程序会以这种方式泄漏内存?

编辑

我不是在谈论查看特定泄漏,而是该进程正在消耗越来越多的内存。据他介绍,该进程不会因某些内存泄漏而消耗更多内存。

【问题讨论】:

    标签: memory-leaks


    【解决方案1】:

    根据编译结构,可能在第一次访问内存之前实际上并未分配内存。例如这个脚本:

    while(malloc(50));
    

    可以说是导致内存泄漏 - 因为它只是不断分配内存,直到它全部被占用。但是,如果在使用内存之前没有实际分配内存,那么这将是一个“不可见的泄漏”——尽管我承认它扩展了泄漏的定义;)。

    【讨论】:

    • 如果没有分配,也不是内存泄漏。未分配 = 没有内存。
    【解决方案2】:

    内存泄漏是当程序内存中存在一块内存被标记为已占用并且程序中没有指针变量存储该块的地址时的情况。任务管理器和类似实用程序显示占用的内存总量(加上开销,加上碎片),他们不知道指针 - 他们无法检查程序内存。

    这就是为什么对于此类实用程序而言,无法区分泄漏内存和程序存储指针所占用的内存的原因。所以“悄悄地”泄漏内存——以一种隐蔽的方式使得程序的内存消耗不会增加——是不可能的。

    【讨论】:

    • 你可以使用一个查找内存泄漏的工具——deleaker。很酷的应用程序!
    • 在我接受答案时忘记了 +1。你现在明白了。迟到 6 年总比没有好,对吧?
    【解决方案3】:

    首先,这取决于您如何定义内存泄漏。我通常会考虑任何已分配内存但没有保留指针/引用的情况都是内存泄漏,而不仅仅是应用程序不断分配内存而不释放它的情况。 (如果涉及 GC,您可能需要再次使用不同的定义)

    没有这个定义,不可能通过任务管理器查看所有内存泄漏,因为进程可能不会在程序释放所有内存后将所有内存返回给操作系统,因此您不会看到每一个积极或内存使用的负面变化。

    也就是说,任何不断吞噬内存的进程确实看起来很可疑

    【讨论】:

      猜你喜欢
      • 2021-01-04
      • 2020-05-25
      • 2013-06-25
      • 2014-08-14
      • 1970-01-01
      • 2015-04-25
      • 2014-07-10
      • 2011-12-10
      • 1970-01-01
      相关资源
      最近更新 更多