使用比较 Xcode iOS 9 中“其他进程”内存不足

2023-12-21

我的应用程序在内存为 0.5GB 的设备上崩溃。然而,在 Xcode 中分析内存使用情况 - 它很少超过 140MB。我用仪器检查过泄漏情况,但没有发现明显的泄漏。

但是,当我运行我的应用程序时,“其他进程”使用的内存总是非常高。这是启动后的静止状态:

我在代码中的每个循环周期中添加了 1 秒延迟,并发现在每个循环中,“其他进程”使每个对象的内存使用量增加了约 3MB,直到在 0.5GB 设备上耗尽并崩溃。

这个问题 https://stackoverflow.com/questions/27383758/xcode-memory-usage-comparison表明这些是使用该内存的其他应用程序,但我已经关闭了所有其他应用程序,并且使用情况与我的循环代码直接相关。

什么可能在我的应用程序中实际运行的其他进程中使用内存?为什么我的“其他进程”占用了这么多内存?

为了让大家了解我在做什么,我从 Parse 中提取数据,然后循环访问每个返回的对象并从数据创建一个 SKNode 子类对象。我将此节点添加到数组(仅供参考)和场景中。这是我在主线程上执行的添加了延迟的代码。注意该行:

self drawRelationships:[_batches objectAtIndex:_index] forMini:_playerMini];

是一个 BFTask 等等异步的。我将数组分成更小的批次,这样我就可以在绘制每个批次时看到增量的内存使用情况。如果我尝试一次绘制全部,OOM 会立即发生......

- (void)drawNewRelationships
{
    _batches = [NSMutableArray array];
    _index = 0;

    [_playerMini fetchInBackgroundWithBlock:^(PFObject *object, NSError *error) {
        [ParseQuery getNewRelationshipsForMini:_playerMini current:_miniRows.relationshipIds withBlock:^(NSMutableArray *newRelationships) {
            _batches = [self batchArrays:3 fromArray:newRelationships];
            _index = 0;
            [self drawBatches];
        }];
    }];
}

- (void)drawBatches
{
    if ([_batches objectAtIndex:_index]) {
        [self drawRelationships:[_batches objectAtIndex:_index] forMini:_playerMini];
        _index++;
        if (_index < [_batches count]) {
            [self performSelector:@selector(drawBatches) withObject:nil afterDelay:1];
        }
    }
}

该节点包含其他数据(几个数组、自定义对象),我尝试在删除所有数据的情况下运行该应用程序。我尝试过在主线程和后台线程上运行。我尝试过使用 BFTask 异步执行操作。我尝试过的所有操作最终都会产生相同的行为 - 创建这些 SKNode 对象会耗尽“其他进程”中的内存,直到在内存不足的设备上崩溃。

值得注意的是,这种行为是从 iOS9 才开始出现的。

基本上,什么可以在“其他进程”中使用所有这些内存以及如何释放它?

Update

我尝试运行 Sprite Kit 示例应用程序,甚至在启动时在其他进程中使用 ~550MB。这可能是 Sprite Kit 的一个主要错误吗?


事实证明这是一个相当具体的问题。分配给其他进程的内存实际上是我的应用程序的内存泄漏。当我展平具有许多子节点的节点,但没有清空包含对所有预展平节点的引用的 NSDictionary 时,就会发生这种情况。由于某种原因,这个内存泄漏在分析时没有出现。

我还发现了一篇非常好的博文:http://battleofbrothers.com/sirryan/memory-usage-in-sprite-kit http://battleofbrothers.com/sirryan/memory-usage-in-sprite-kit减少应用程序的内存占用。如果您正在尝试优化,值得一读。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用比较 Xcode iOS 9 中“其他进程”内存不足 的相关文章

  • 当列表需要更多空间时,在 C# 中将其空间加倍。在某些时候,将 1024 倍增至 2048 是否会降低效率?

    当数字较小时 数组列表的大小很快就会从 2 个内存地址增加到 4 个内存地址 但当它开始增加空间量接近数组列表中允许的最大空间量 接近 2MB 限制 时 如果仅将数组的大小增加到某个时刻所需大小的一小部分 那么更改在这些较大区域中分配的空间
  • .NET 进程分配的内存何时释放回 Windows

    设置 NET 在启动时以及在收集后尝试满足分配请求时 分段为每一代的堆 0 1 2 LOH 分配内存 以获得连续的内存块 为每个堆分配的内存可能会随着应用程序 预热 而趋于平稳 但第 2 代和大型对象堆可能除外 在垃圾收集期间 每个堆 0
  • 在 CUDA 中的设备内存上分配 2D 数组

    如何在 Cuda 中的设备内存中分配和传输 往返于主机 2D 数组 我找到了解决这个问题的方法 我不必展平阵列 内置的cudaMallocPitch 函数完成了这项工作 我可以使用以下命令将阵列传输到设备或从设备传输阵列cudaMemcpy
  • C:内存池库?

    我需要一些快速 线程安全的内存池库 我用谷歌搜索了很多 但是快速的解决方案没有线程安全 而其他的则非常大 有什么建议么 nedmalloc 和 ptmalloc 都是基于 C 的线程缓存内存管理器 基于 doug lea 的 malloc
  • 编程环境中的虚拟地址空间

    我对虚拟地址空间的含义感到困惑 在 32 位机器中 进程可以寻址 2 32 个内存位置 这是否意味着每个进程的虚拟地址空间是 2 32 4GB 以下是进程虚拟地址空间的快照 这个可以增长到4GB吗 这样的系统中进程数量有限制吗 这个可以增长
  • 如何为具有圆角的精灵设置物理体

    我创建了一个SKShapeNode通过以下方式 let sprite SKShapeNode rect CGRect x 20 y 10 width 40 height 20 cornerRadius 10 我也像这样设置了一个物理体 sp
  • Java BigDecimal 内存使用情况?

    是否有一个指南来估计一个程序消耗的内存量BigDecimal 寻找与这些类似的东西指导方针 http www javamex com tutorials memory string memory usage shtml用于估计String内
  • 如何在 Parse Cloud 代码中访问 Facebook Graph API?

    我需要在云函数中获取在我的 Parse 应用程序中使用 Facebook 登录的用户的好友 我怎样才能实现这个目标 我尝试安装facebook node sdk https github com Thuzi facebook node sd
  • PresentModalViewController 上的内存泄漏

    我正在打开相机供用户拍照 当我拍照并按下 使用 按钮时 我不断出现内存泄漏 selfpresentModalViewController imagePickeranimated YES 完整代码 imagePicker UIImagePic
  • 打电话时暂停游戏,接听电话和按主页键有什么区别?

    当按下主页按钮时 我的游戏会正常暂停 但当我接到电话时却没有 当游戏开始时 其操作将恢复 我不明白接电话和按 HB 之间的区别 请帮帮我 Thanks func pauseGame initResumeButton pause remove
  • 有没有办法改变 SpriteKit 调试数据的字体和位置?

    基本上就是标题里说的 有没有办法改变 SpriteKit 调试数据的字体和 或位置 我们在viewController中设置的数据 skView showsFPS YES skView showsNodeCount YES skView s
  • 如何在 SpriteKit SKScene 类中启动 ReplayKit 屏幕录制

    我已经实施了ReplayKit in my SpriteKit游戏 但由于一切都在游戏内完成GameViewController录制按钮出现得太早 请看我的GameViewController下面的类 class GameViewContr
  • 如果我每次创建粒子时都强制重新初始化每个粒子,我是否应该使用粒子池

    我正在 XNA4 中创建一个粒子系统 但遇到了问题 我的第一个粒子系统是一个简单的粒子列表 其实例是在需要时创建的 但后来我读到了有关使用池的内容 我的第二个系统由一个充满粒子的池和一个发射器 控制器组成 我的池非常基本 这是代码 clas
  • Forth 中 S" ..." 的生命周期是多少?

    我一直在尝试阅读此内容 但找不到任何提及 根据标准 创建的字符串S 无法修改 并且通过简单的实验Gforth http en wikipedia org wiki Gforth很明显 字符串的空间不是来自字典或填充区域 hex here 7
  • Glassfish 上的内存管理

    我的 Glassfish 服务器上运行着几个后台任务 由 TimerService实例 这些服务的目标是从文件中提取数据并将该数据插入数据库 我最初尝试在 JPA 中执行此操作 但系统很容易就停滞了 我现在已将该过程转换为 JDBC 它的响
  • Xcode 7.0 Beta 无法在 Apple Watch 上启动 watchOS 2 应用程序

    尝试了公共示例代码项目和我自己的项目 观察 watchOS 1 没有问题 watchOS 2 应用程序在真实 Apple Watch 和模拟器上成功安装并运行 但不支持通过 Xcode 在设备上启动应用程序的调试模式 尝试让系统创建Prov
  • 线程缓存和 Java 内存模型

    我正在尝试了解 Java 内存模型和线程 据我了解 每个线程都有 主 内存的本地副本 因此 如果一个线程尝试更改int变量 例如某个对象的变量 它会缓存int变量 如果它更改它 其他线程可能看不到更改 但是如果线程缓存一些对象而不是 int
  • 在 SKScene 上运行 SKTransition 是否会破坏原始 SKScene?

    在 SKScene 上运行 SKTransition 是否会破坏原始 SKScene 例如 SKTransition reveal SKTransition revealWithDirection SKTransitionDirection
  • 如何在数据部分(RAM)中保留一定范围的内存并防止同一应用程序使用该内存的堆/堆栈?

    我想在 RAM 中保留 分配一定范围的内存 并且同一应用程序不应覆盖或使用该范围的内存进行堆 堆栈存储 如何在内存中分配一定范围的内存以防止堆栈 堆覆盖 我考虑过向应用程序本身添加 或分配 一个数组并保留内存 但它被编译器优化了 因为它在应
  • Swift SpriteKit edgeLoopF​​romRect 问题

    下面的代码可以识别底部和顶部边缘场景和球按预期弹开 但是 那左边缘和右边缘现场的情况一直被破坏 如果施加足够的力 球会离开屏幕 然后最终返回 就好像场景的边缘超出了 iPhone 模拟器窗口的边缘 import SpriteKit clas

随机推荐