看到 malloc 分配大块内存 - 试图找出原因(iPhone)

Posted

技术标签:

【中文标题】看到 malloc 分配大块内存 - 试图找出原因(iPhone)【英文标题】:Seeing malloc allocating large chunks of memory - trying to track down why (iPhone) 【发布时间】:2010-09-02 15:31:24 【问题描述】:

我看到我的应用程序被 ios 杀死并显示内存不足消息,但是,在 Allocations Instrument 中跟踪应用程序的进度时,我看到许多 malloc 似乎发生在我的代码之外写好了。

我没有看到任何泄漏,所以我认为这些分配应该存在。问题是,因为我不确定为什么要分配它们,所以我不确定我可以做些什么来优化应用程序并防止操作系统抛弃我的应用程序。

有谁知道为什么要分配内存,或者有什么办法让我找出来?

这里有几张来自 Instruments 的镜头,展示了 malloc。在第二张照片中,所有分配都有相同的堆栈跟踪。

编辑

我将单个大图像显示为 UIView 背景 (1024x768),然后在包含两个 550px 正方形图像的图像的顶部覆盖一个较小的(600px 正方形)UIView 和一些自定义绘图和第三个 UIView(550px 正方形)覆盖。

我猜这是不合适的,并且可能有更好的方法来实现应用程序工作所需的视图组合。

这应该可以在 iPad 上实现吗?

【问题讨论】:

读取右侧的堆栈跟踪。从其中列出的函数和方法的名称,您可以推断出内存分配的目的。 【参考方案1】:

我认为这里没有太多的信息可以继续说明 - 如果您添加更多关于您的应用中此视图正在做什么的信息,您可能会得到一些更明智的建议。

从屏幕截图中可以看出,正在分配大块来显示图像。

鉴于我冒昧地猜测您正在尝试显示一些非常大的图像,或者您的 UIView 很大,或者您的内存中有更多 UIView 需要显示当前屏幕。

我想准确追踪它们来自何处的最简单方法是禁用您怀疑的应用程序部分,然后再次运行并查看分配是否仍然存在。

编辑

所有图片的大小都与您显示的一样吗? (即,您是否尝试将 5M 的照片显示为 1024x768 背景?)如果不是,您可能需要将它们缩小到您要显示的尺寸,或者至少更接近。

如果您不需要透明度,请确保将所有视图设为不透明。

【讨论】:

这正是我想要做的——我已经用更多细节更新了我的问题。 我已经用立即想到的东西更新了我的答案 - 希望其他人提出其他想法。现在您知道原因,可能值得让您的问题摘要更具体。 图像尺寸都正确,我确实需要透明度。查看堆栈跟踪,CA:条目是核心动画吗? 先生。马特:当然看起来像。它们位于 QuartzCore 中,与 Core Animation 的公共 API 相同的框架。您可以在 QuartzCore 可执行文件上运行 nm 并将输出通过管道传输到 c++filt 以测试该理论。【参考方案2】:

我找到了问题的根源——我正在使用

[UIImage imageNamed:@'Someimage']

加载我的图像。我相信很多人都知道,这会缓存图像数据。我有足够大的图像导致我的应用程序被抛弃。

问题很明显不是因为图像的大小,而是因为我使用的图像的大小和数量。这里的课程是be careful with [UIImage imageNamed:]。

感谢大家的帮助,伙计们!

【讨论】:

【参考方案3】:

Malloc 可能发生在您的应用调用的其他 API 内部(例如加载图像、视图、播放长声音等)。您可以尝试将图像、视图、声音和其他对象的大小更改为不同数量的测试,并查看 malloc 内存更改的大小是否跟踪您所做的更改之一。

【讨论】:

以上是关于看到 malloc 分配大块内存 - 试图找出原因(iPhone)的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2010 C++:malloc()/HeapAlloc 总是为最小的分配大小分配新页面

简单理解memcached的内存分配

malloc函数分配内存失败的常见原因

malloc在函数内分配内存问题

16 malloc 虚拟内存分配的调试

内存映射:小块内存申请brk和申请大块内存的Mmap分析