2010-11-19 26 views
4

系统管理员告诉医生可以隐藏内存泄漏。即如果应用程序正在泄漏内存,应用程序使用的所有内存可能在任务管理器或等效工具中不可见。隐藏的内存泄漏

他似乎很确定这一点。我始终认为,在任务管理器(或进程管理器)等工具中,所有内存泄漏都能正确显示(不以字节为单位,但内存不断增加,直到服务器中没有更多内存)?

他的陈述是否正确,如果是这样的话:哪种类型的程序会以这种方式泄漏内存?

编辑

我不是在谈论看到具体的泄漏,但该进程占用越来越多的内存。据他介绍,这个过程不会消耗更多的内存来处理某些内存泄漏。

回答

4

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

这就是为什么泄漏的内存和只是占用内存的程序存储指针是无法区分这些实用程序。因此,“无声无息地”泄漏内存 - 以一种隐藏的方式,使程序的内存消耗不会增加 - 是不可能的。

+1

您可以使用工具来查找内存泄漏 - 删除者。酷应用程序! – MastAvalons 2011-12-14 17:20:05

+0

当我接受答案时忘记了+1。你现在明白了。迟到6年胜过永远,对吧? – jgauffin 2016-12-09 18:58:01

+0

@jgauffin Upvotes永远不会迟到。 – sharptooth 2016-12-12 10:21:53

0

首先它取决于你如何定义内存泄漏。我通常会考虑任何分配内存的情况,但没有指针/引用留给内存泄漏,而不仅仅是应用程序在不释放内存的情况下连续分配内存的情况。 (如果涉及到GC,则可能需要再次定义不同的定义)

使用此定义no时,不能通过任务管理器查看所有内存泄漏,因为进程可能不会将所有内存都返回给操作系统它是由程序发布的,因此您不会在内存中使用任何正面或负面的变化。

不过是constanly吞噬内存的任何进程肯定看起来可疑

0

根据编译结构的不同,内存实际上并没有被分配,直到第一次访问为止。因此,例如这个脚本:

while(malloc(50)); 

可以说是造成内存泄漏 - 它只是不断,直到它被全部取分配内存。但是,如果内存在使用前并未实际分配,那么这将是一个'不可见的泄漏' - 尽管我承认它正在扩展泄漏的定义;)。

+0

如果没有分配,它也不是内存泄漏。未分配=无内存。 – jgauffin 2010-11-19 12:33:00