运行 在使用情况比较 'Other Processes' 中内存不足 Xcode iOS9
Running out of memory in 'Other Processes' in Usage Comparion Xcode iOS9
我的应用程序在内存为 0.5GB 的设备上崩溃。但是,分析 Xcode 中的内存使用情况 - 它很少超过 140MB。我已经使用仪器检查泄漏,并且 none 很重要。
但是,当我 运行 我的应用程序时, 'Other Processes' 使用的内存总是很高。这是启动后的静止状态:
我在我的代码中的每个循环周期中添加了 1 秒的延迟,并发现在每个循环中,'other processes' 将每个对象的内存使用量增加了大约 3MB,直到在 0.5GB 的设备上,它运行 出问题并崩溃。
This question 表明这些是使用该内存的其他应用程序,但我已经关闭了所有其他应用程序,并且使用情况与我的循环代码直接相关。
什么可能在其他进程中使用内存,实际上是 运行ning 在我的应用程序中?为什么我的 'Other Processes' 占用了这么多内存?
为了了解我在做什么,我从 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];
}
}
}
该节点包含其他数据(几个数组、自定义对象),我已经尝试 运行在删除所有数据的情况下对应用程序进行设置。我已经在主线程和后台线程上尝试了 运行ning。我试过使用 BFTask 异步执行操作。我尝试过的所有操作都以相同的行为结束——创建这些 SKNode 对象会占用 'Other Processes' 中的内存,直到在低内存设备上崩溃。
可能值得注意的是,此行为自 iOS9 后才开始出现。
基本上,什么可以使用 'other processes' 中的所有这些内存以及如何释放它?
更新
我已经尝试 运行ning Sprite Kit 示例应用程序,即使它在启动时在其他进程中也使用了大约 550MB。这可能是 Sprite Kit 的主要错误吗?
好吧,事实证明这是一个相当具体的问题。分配给其他进程的内存实际上是我的应用程序内存泄漏。它发生在我用许多 children 展平一个节点时,但没有展平包含对所有 pre-flattened 节点的引用的 NSDictionary。出于某种原因,这个内存泄漏在分析时没有出现。
我还发现了一个非常好的博客 post:http://battleofbrothers.com/sirryan/memory-usage-in-sprite-kit 关于减少应用程序内存占用的内容。如果您想优化,值得一读。
我想为那些不一定使用 SpriteKit 但面临其他进程占用越来越多内存的问题的人提供解决方案 - 这意味着存在泄漏。到目前为止,这是我在 'Other processes' 中发现的调试泄漏的最佳方法。
- 打开仪器,selectActivity监视器
- 在您的应用程序中重现这些步骤,查看哪个进程正在获取泄漏的所有权。例如,如果它是 mediaserverd,您可能有围绕 encoding/decoding 或与媒体相关的内容的泄漏,因此释放缓冲区或释放解压缩会话之类的事情可能无法按计划工作。
- 既然您已经知道要查找的位置,请打开 Xcode 并使用“调试内存图”工具,查找潜在的泄漏实例,您应该会看到所有针对它的强引用。对于我自己来说,在 objective-c++ 中工作很多,结果发现经常缺少 autoreleasepools。
我的应用程序在内存为 0.5GB 的设备上崩溃。但是,分析 Xcode 中的内存使用情况 - 它很少超过 140MB。我已经使用仪器检查泄漏,并且 none 很重要。
但是,当我 运行 我的应用程序时, 'Other Processes' 使用的内存总是很高。这是启动后的静止状态:
我在我的代码中的每个循环周期中添加了 1 秒的延迟,并发现在每个循环中,'other processes' 将每个对象的内存使用量增加了大约 3MB,直到在 0.5GB 的设备上,它运行 出问题并崩溃。
This question 表明这些是使用该内存的其他应用程序,但我已经关闭了所有其他应用程序,并且使用情况与我的循环代码直接相关。
什么可能在其他进程中使用内存,实际上是 运行ning 在我的应用程序中?为什么我的 'Other Processes' 占用了这么多内存?
为了了解我在做什么,我从 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];
}
}
}
该节点包含其他数据(几个数组、自定义对象),我已经尝试 运行在删除所有数据的情况下对应用程序进行设置。我已经在主线程和后台线程上尝试了 运行ning。我试过使用 BFTask 异步执行操作。我尝试过的所有操作都以相同的行为结束——创建这些 SKNode 对象会占用 'Other Processes' 中的内存,直到在低内存设备上崩溃。
可能值得注意的是,此行为自 iOS9 后才开始出现。
基本上,什么可以使用 'other processes' 中的所有这些内存以及如何释放它?
更新
我已经尝试 运行ning Sprite Kit 示例应用程序,即使它在启动时在其他进程中也使用了大约 550MB。这可能是 Sprite Kit 的主要错误吗?
好吧,事实证明这是一个相当具体的问题。分配给其他进程的内存实际上是我的应用程序内存泄漏。它发生在我用许多 children 展平一个节点时,但没有展平包含对所有 pre-flattened 节点的引用的 NSDictionary。出于某种原因,这个内存泄漏在分析时没有出现。
我还发现了一个非常好的博客 post:http://battleofbrothers.com/sirryan/memory-usage-in-sprite-kit 关于减少应用程序内存占用的内容。如果您想优化,值得一读。
我想为那些不一定使用 SpriteKit 但面临其他进程占用越来越多内存的问题的人提供解决方案 - 这意味着存在泄漏。到目前为止,这是我在 'Other processes' 中发现的调试泄漏的最佳方法。
- 打开仪器,selectActivity监视器
- 在您的应用程序中重现这些步骤,查看哪个进程正在获取泄漏的所有权。例如,如果它是 mediaserverd,您可能有围绕 encoding/decoding 或与媒体相关的内容的泄漏,因此释放缓冲区或释放解压缩会话之类的事情可能无法按计划工作。
- 既然您已经知道要查找的位置,请打开 Xcode 并使用“调试内存图”工具,查找潜在的泄漏实例,您应该会看到所有针对它的强引用。对于我自己来说,在 objective-c++ 中工作很多,结果发现经常缺少 autoreleasepools。