每秒有数千个新的 0 大小对象添加到我的净总数中,我应该担心吗?

Posted

技术标签:

【中文标题】每秒有数千个新的 0 大小对象添加到我的净总数中,我应该担心吗?【英文标题】:Thousands of new 0 size objects being added to my net total every second, should I be worried? 【发布时间】:2009-06-27 18:48:29 【问题描述】:

我刚刚消除了我的项目的泄漏,但在“GeneralBlock-0”类别下仍有数千个对象。净分配的数量是巨大的(在我输入时它接近一百万),但它们都不是泄漏,而且它们的大小都不大于 0 字节。

更新和编辑:

QuartzCore 负责所有违规对象。

负责的调用者是(按游戏循环每次迭代的执行顺序:

-[CALayer setPosition:]
x_hash_table_new_  // x2
hash_table_modify
-[CALayer setPosition:] // x9
-[CALayer(CALayerPrivate)_copyRenderLayer:flags:] //x13

在设备上运行时,48 字节大小的对象分配在 GeneralBlock-64、128、256 等下,具有与上述相同的属性。这不可接受的,因为它显然会导致显着减速。 这是我的项目中的代码问题被追踪到:

topRow.center = CGPointMake(topRow.center.x,topRow.center.y-PIXELS_PER_FRAME);
while (nextRow = thisTopRow.below)  //stops running when thisTopRow.below is nil
    nextRow.center = CGPointMake(nextRow.center.x,nextRow.center.y-PIXELS_PER_FRAME);       
    if (nextRow.center.y+20 < 401 && !nextRow.userInteractionEnabled)
        [nextRow enableInteraction];        
    thisTopRow = nextRow;

我的印象是 CGPoint 是一种类型,并且会在代码块的末尾被释放。为什么会占用我的记忆?如果归根结底,我会将我保存在仪器中的跟踪文件上传给任何感兴趣的人,但我很确定我已经涵盖了所有内容。

【问题讨论】:

iCodeBlog.com 的 iTennis 中也出现了同样的问题,这是我用来入门的教程。一切都指向改变 UIImageView 的位置,无论是通过改变中心还是框架。 【参考方案1】:

假设您可以复制模拟器下的行为,请检查以确保您的应用程序的 RSIZE 没有也在终端中使用“top -u”增加。

这很可能是因为 QuartzCore 已经实现了自己的分配器和分配区,但还没有完全融入 Instruments 使用的统计信息收集机制。

请提交错误。

【讨论】:

你把我弄丢了......你能用外行的话解释一下你想告诉我什么吗? top 命令显示有关进程的信息。 Bill 建议从终端运行 top 并观察您的应用程序的 RSIZE(驻留内存大小)的行为。他建议 Instruments 可能没有监控 QuartzCore 内存,它可能分配在与“普通”Objective-C 对象的默认值不同的区域(内存区域)中。基本上,如果 Instruments 说您有大量泄漏,但 top 显示 RSIZE 保持稳定,那么 Instruments 是错误的,因为它没有获得 QuartCore 内存的正确统计信息。如果是这样,请提交错误 - bugreport.apple.com【参考方案2】:

同样的问题... 在模拟器中分配了零字节,但在设备中,CALayer 中的每个方法调用都将我的内存提高了 48 个字节。

这会导致内存问题。

穆拉利。

【讨论】:

是的,你和 niv 遇到了和我一样的问题。我也只在设备上为每个 UIImageView 更改位置实例获得 48 字节分配成本,但我没有使用 UIScrollView。另外,请记住,当这篇文章没有提供问题的答案时,您已经发布了答案。以后,请使用问题下方的“添加评论”按钮发表评论,并保留“答案”部分以获取解决方案。【参考方案3】:

我也在处理这个问题。我正在使用带有一些 UIImageViews 的 UIScrollView,每次滚动视图的偏移量发生变化时,都会调用 -[CALayer(CALayerPrivate) _copyRenderLayer:flags:] 将内存提高 48 个字节。

再一次——在模拟器上这被记录为 0 字节,但在我的设备上它一直在消耗我的记忆。

【讨论】:

这也是我遇到的一个问题。请参阅对 Murali 帖子的评论。作为新用户,这是您需要阅读的内容。

以上是关于每秒有数千个新的 0 大小对象添加到我的净总数中,我应该担心吗?的主要内容,如果未能解决你的问题,请参考以下文章

1014细菌繁殖

知名 GUID 列表 [关闭]

实体框架代码首次迁移文件源代码控制

从一张图看清世界上最大的数据中心分布区域

尝试将 Vlookup 片段添加到我的 Excel 宏

如何在 python 3 中将类对象列表“保存”到我的程序中?