2

我决定将 GC 用于我最新的 Cocoa 项目的内存管理,我发现了一些有趣的东西——如果我在 Xcode 中创建一个全新的 Cocoa 应用程序项目,将 GC 设置为支持或必需(我都尝试过),构建并运行它泄漏,它显示内存泄漏!

主要是 NSCFData、GeneralBlock、CGEvent、CFDictionary、CGSRegion 等类型的对象的大量微小泄漏。

重现步骤:

  1. 文件->新建项目->Cocoa应用
  2. 项目->编辑项目设置->GC 必需(或支持,任一)
  3. 构建->构建
  4. 运行->使用性能工具运行->泄漏
  5. 等待泄漏检测触发(我将其设置为 10 秒,默认为 30)

大约 80% 的时间我会泄漏大约 2-20 Kb 的上述各种对象。

其他人有同样的行为吗?


编辑:我通过重命名 InputManagers 文件夹测试了以下情况(此时日志消息消失了,所以它们肯定不再被加载)并且仍然出现内存泄漏。因此,这似乎与它无关。我把文字留在那里,所以阿什利克拉克的回答仍然有意义。

我知道的唯一奇怪的情况是,每当我运行启用了 GC 的应用程序时,我都会在控制台中收到以下消息:

2008-12-12 13:03:09.829 MemLeakTest[41819:813] Error loading /Library/InputManagers/Inquisitor/Inquisitor.bundle/Contents/MacOS/Inquisitor:  dlopen(/Library/InputManagers/Inquisitor/Inquisitor.bundle/Contents/MacOS/Inquisitor, 265): no suitable image found.  Did find:
    /Library/InputManagers/Inquisitor/Inquisitor.bundle/Contents/MacOS/Inquisitor: GC capability mismatch
2008-12-12 13:03:09.840 MemLeakTest[41819:813] Error loading /Library/InputManagers/Saft/SaftLoader.bundle/Contents/MacOS/SaftLoader:  dlopen(/Library/InputManagers/Saft/SaftLoader.bundle/Contents/MacOS/SaftLoader, 265): no suitable image found.  Did find:
    /Library/InputManagers/Saft/SaftLoader.bundle/Contents/MacOS/SaftLoader: GC capability mismatch

我猜这与这两个插件试图加载到每个启动的程序中有关,而不仅仅是 Safari(它们是它们的插件)。我不确定这是否与此有关,但这似乎绝对是一种可能性。我无法方便地使用带有开发工具的干净而不是 OS X 10.5 来测试在没有 SAFT 或 Inquisitor 的原始安装上是否会发生同样的事情。

4

2 回答 2

5

leaks工具在 Leopard 中的 Objective-C 垃圾收集下并不准确,因为它对垃圾收集器的运行时结构了解不足,无法实际确定哪些对象仍然存在但准备好被回收。

此外,您对结果的解释有点错误leaks:看起来像泄漏的东西不是来自NSCFData、CGEvent 等——那些假定的泄漏对象。

如果您认为特定对象在 Objective-C 垃圾回收下的生存时间过长,那么您可以使用 GDB 中的info gc-references和命令。Bill Bumgarner 在Cocoa-Devinfo gc-roots的这篇文章中讨论了它们以及 GC 下“泄漏”的一般概念。

于 2008-12-13T08:21:08.073 回答
1

这些日志消息告诉您 Inquisitor.bundle 和 SaftLoader.bundle 不是为在 GC 程序下运行而构建的,因此不会被加载。虽然它们可能仅适用于 Safari,但它们是输入管理器,这意味着每个Cocoa 应用程序都会在启动时尝试加载它们,因此编写不当的输入管理器可能会导致很多问题。

我怀疑他们对您所看到的负责,但如果您想在没有他们的情况下进行测试,只需在运行测试之前重命名 InputManagers 文件夹,它们将被忽略。

你在哪里看到这些泄漏?

于 2008-12-12T21:33:56.493 回答