【问题标题】:Are there memory leaks in Linux?Linux中是否存在内存泄漏?
【发布时间】:2011-10-07 19:34:25
【问题描述】:

这个问题纯属理论。

我想知道 Linux 源代码 是否可能存在内存泄漏,以及他们如何调试它,考虑到毕竟是 Linux 处理每个程序的内存?

我很清楚,Linux 是用 C 语言编写的,它必须自己处理 mallocfree。我不明白的是我们如何测量操作系统的内存泄漏。

请注意,这个问题不是特定于 Linux 的;它还解决了 Windows 和 MacOS X (darwin) 中的相应问题。

【问题讨论】:

  • 很可能,是的,某处存在内存泄漏。几乎不可能在没有一次内存泄漏的情况下编写这么多代码(即使您是世界上最好的 C 程序员)。至于他们如何调试它,idk。
  • 所有代码都有bug;其中一些错误会导致内存泄漏。这包括操作系统代码。但是,由于操作系统需要在不重新启动的情况下运行数天/数周/数月,您可以预期这些错误将被最小化到一个较小的水平。
  • 所有代码都有错误...嗯,不是我的!绝不!好吧,至少我还没有找到,而且我的用户也没有报告过任何……不,不是我!
  • @Mark 我确实希望它们被最小化!但是由于我无法进行基准测试,我该如何检查哪个操作系统的泄漏最多?
  • @Thaddee,触发内存泄漏的条件可能与您在系统上执行的操作以及操作系统本身高度相关。如果我知道如何自动触发错误,我就不会为谋生而工作!您正在考虑的操作系统的典型正常运行时间将具有良好的相关性,并且可能对您来说比纯粹的泄漏更有用。

标签: windows linux macos memory-leaks operating-system


【解决方案1】:

非主流驱动程序和暂存树经常存在内存泄漏。遵循 LKML,您可以看到偶尔修复网络代码中的错误,用于处理 SKB 的极端案例列表。

由于内核的性质,大部分工作是代码审查和重构,但仍在继续开发更多工具:

http://www.linuxfoundation.org/en/Google_Summer_of_Code#kmemtrace_-_Kernel_Memory_Profiler

在某些情况下,您可以使用像 Usermode Linux 这样的框架,然后使用像 Valgrind 这样的传统工具来尝试查看正在运行的代码:

http://user-mode-linux.sourceforge.net/

【讨论】:

    【解决方案2】:

    malloc 和 free 的实现(实际上是 brk/sbrk,因为 malloc 和 free 是由 libc 进程内实现的)并不神奇或特殊 - 它只是代码,就像其他任何东西一样,并且背后有数据结构描述映射。

    如果您想测试正确的行为,一种方法是在用户空间中编写测试程序,这些程序已知会分配然后正确释放它们的所有内存。运行应用程序,然后使用调试器在内核模式下检查内部内存分配结构(或者更好的是,将此检查作为进程关闭时的调试断言)。

    【讨论】:

    • 那应该检查mallocfree是否工作正常,但是操作系统代码呢?
    • 这是内核调试器的用武之地。
    【解决方案3】:

    所有软件都有错误,包括操作系统。其中一些错误会导致内存泄漏。

    Linux 有一个内核调试器来帮助追踪这些东西,但是在追踪它们之前必须先发现它们的存在。通常,一旦发现了一个错误并且可以随意复制,它就会变得更容易修复(相对而言!显然你需要一个好的编码人员来完成这项工作)。困难的部分是首先找到错误并创建可靠的测试用例来展示它们。这就是您需要拥有一支熟练的 QA 团队的地方。

    所以我想这个答案的简短版本是好的 QA 和好的编码一样重要。

    【讨论】:

      猜你喜欢
      • 2011-06-26
      • 2011-01-29
      • 2011-05-08
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      相关资源
      最近更新 更多