【问题标题】:XCode heapshots non-objects increases causing memory crashXCode heapshots 非对象增加导致内存崩溃
【发布时间】:2025-12-20 07:55:07
【问题描述】:

我有一个在 iPad 上运行的应用程序。我会说相当复杂的一个。我现在面临的主要问题是内存崩溃。经过几个讨论线程后,我无法弄清楚如何解决它。

我所有的内存泄漏都已修复。在监视仪器中的 heapshots 时,它们会在每个周期持续增加 1 MB 的数量级(我在应用程序的一个正常“状态”下进行 heapshots)。 80% 的 heapshots 增加属于“非对象”类别。它们的引用计数均为 1。

这些非对象内存占用是我的内存崩溃的可能原因吗?或者这只是一个症状?我应该在其他地方寻找根本原因吗?如果这些是可能的原因,那么消除这些记忆猪的系统方法是什么?

编辑:添加了屏幕截图。如您所见,没有调用我的代码(底部的 main() 除外)。有人能理解右侧的扩展细节吗,我在哪里可以找到,以删除引用计数为 1 的这 16 位内存(非对象)?这只是一个例子,有成千上万,导致我的记忆增长。

【问题讨论】:

  • 抱歉,由于我在这个论坛的声誉低,我的图片无法上传 :-) 我会尽快添加。我已经为这个问题苦苦挣扎了好几个星期。我保证会在我取得进展的过程中返回我的发现。
  • 这里是关于这个问题的更新。我将整个代码迁移到 ARC。它解决了很多问题。为了给出全貌,仍然发生了一些记忆问题。当深入挖掘时,我发现我的一个数据库函数使连接保持打开状态(而不是关闭它),这导致了内存占用。感谢大家帮助我。

标签: objective-c ios memory-management heap-memory


【解决方案1】:

我猜这些是在堆上分配的简单缓冲区,就像malloc() 一样。对于在两个堆之间分配和未释放的所有堆,检查堆栈跟踪以查看导致分配的原因。如果它在您的代码中,请确保您正在释放您分配的任何内容。

顺便说一句,并非所有内存管理问题都会导致真正的泄漏。真正的泄漏是您的代码丢失了地址的分配,因此无法想象释放它。伪泄漏是您仍然可以引用该对象的地方,但您的代码将永远不会再次使用它。也就是说,你已经将它藏在某个数据结构中的某个地方,永远不会再次访问它,而你真的应该释放它并忘记它。

因此,您可能要对非对象分配负责,因为您在不需要时保留对象。

【讨论】:

  • 感谢您的快速回答。在大多数情况下,堆栈跟踪不是我的代码(我假设是库代码)。真的很难找到是什么原因造成的。如果有帮助,我可以发布一个示例。
  • 看起来是由于 WebKit / WebView。你在用这些吗?
  • 是的,你是对的。我正在使用 webview,当我从代码中删除 webview 时,这个非对象也大幅下降。我需要在我的应用程序中使用 webview。可能是什么原因造成的?有什么我可以进一步研究的吗?再次感谢您的努力。
  • 我不确定。您的应用程序是否反复将新页面加载到 Web 视图中?即使您的应用程序永远不允许这样做,它是否会保留历史记录以便它可以返回?网页是动态的吗?它是否不断加载新元素?您是否追踪了在堆之间累积的所有对象,并且您确定它们应该还活着吗? (我的意思是,一个对象可能会维护大量的非对象分配,所以你必须确保你释放了你想要的一切。)