【问题标题】:Malloc error "can't allocate region" failed with error code 12. Any idea how to resolve this?Malloc 错误“无法分配区域”失败,错误代码为 12。知道如何解决这个问题吗?
【发布时间】:2012-01-18 14:51:51
【问题描述】:

我收到这个错误,不知道该怎么办:

AppName(3786,0xa0810540) malloc: *** mmap(size=16777216) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug

如果我在发生错误的那一行设置断点,我不知道我必须专门搜索什么。在仪器中,我检查了分配,并且值一直在增加,直到所有分配的 14,5 GB。

有人可以帮我吗?
刷子51

编辑 1:
更多信息:
- 我在模拟器中尝试这个,而不是在 iOS 设备上。
- 这就是所有的输出(我得到这个错误更多次)。 - 错误发生在这一行:

NSManagedObjectContext *context = [self managedObjectContext];
NSFetchRequest *fetchREntitySetsCards = [[[NSFetchRequest alloc] init] autorelease];
//NSFetchRequest *fetchREntityRelCardsAnswersNotes = [[[NSFetchRequest alloc] init] autorelease];

NSEntityDescription *entitySetsCards = [NSEntityDescription entityForName:@"EntitySetsCards" inManagedObjectContext:context];
//NSEntityDescription *entityRelCardsAnswersNotes = [NSEntityDescription entityForName:@"EntityRelCardsAnswersNotes" inManagedObjectContext:context];
setEntity:entityCard];
[fetchREntitySetsCards setEntity:entitySetsCards];
//[fetchREntityRelCardsAnswersNotes setEntity:entityRelCardsAnswersNotes];

NSArray *fetchedObjSetsCards    = [context executeFetchRequest:fetchREntitySetsCards error:&error];
//The error is here--->
//NSArray *fetchedObjRelCardsAnswersNotes   = [context executeFetchRequest:fetchREntityRelCardsAnswersNotes error:&error];


//Badges für TabBarItem Inbox setzen
setsCount = [context countForFetchRequest:fetchREntityUserSet error: &error];
cardsCount = [context countForFetchRequest:fetchREntityCard error: &error];

【问题讨论】:

  • "can't allocate region" 表示没有剩余内存空间!可能是时候开始研究内存管理和释放未使用的资源了。
  • iOS,14.5GB 的分配空间?我在这里错过了什么吗?
  • 不开玩笑。 iPhone 4 的内存是什么?是 1GB 吗?
  • 如果没有代码来进一步分析它,我会在黑暗中刺一下,说如果你分配 14.5GB,那么你很可能内存不足(iOS 设备通常没有那么多内存)。错误代码=12 也表明了这一点。
  • @MaxMacLeod 我相信它是 500MB。

标签: ios memory-management malloc allocation


【解决方案1】:

听起来很奇怪,但是当主线程超载时我也有同样的行为。

内存使用已经足够优化:仪器显示没有泄漏,实时内存约为 2Mb,在设备上运行时没有内存警告,所有大量分配都在自动释放池内完成等。

但是在主线程上将数据存储到数据库(使用核心数据)的过程非常庞大。像这样将存储代码移动到后台进程

dispatch_async(dispatch_get_global_queue
  (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  BOOL result = NO;
  result = [[DataManager sharedInstance] storeGuestsToDB];
  dispatch_async(dispatch_get_main_queue(), ^{
  //finalization
  }
}

解决了我的问题。

【讨论】:

  • 我不确定我对你的理解是否正确......你不应该把它放在 main.m 中,但当然你可以尝试在你的应用程序中使用相同的东西。只需放置您认为超载的活动,而不是我对 DataManager 的调用。
  • 感谢您的回答。这正是我的问题。我正在下载并存储一个 JSON 文件(~90mb)。通过将事务移动到另一个线程中,我解决了这个问题。
  • 这对我不起作用……我检查了一下,这不是内存泄漏。我正在使用 CGImageDestinationAddImage 导出 GIF
【解决方案2】:

谷歌搜索会发现很多关于使用仪器来了解你的记忆发生了什么的教程:

如何调试内存泄漏:教程
http://www.raywenderlich.com/2696/how-to-debug-memory-leaks-with-xcode-and-instruments-tutorial

还有一个:
发现 Obj-C 内存泄漏视频
http://www.youtube.com/watch?v=R449qEuexNs&feature=related

*stackoverflow 上有很多similar questions,您可能会从中受益。

【讨论】:

    【解决方案3】:

    由于视图控制器的viewWillLayoutSubviews 中的递归调用,我遇到了这个问题。我正在使集合视图的布局无效,从而导致重复布局视图的无限循环。

    【讨论】:

      猜你喜欢
      • 2019-08-07
      • 2017-04-07
      • 1970-01-01
      • 2021-02-08
      • 2021-09-15
      • 2015-01-11
      • 2015-01-19
      • 1970-01-01
      • 2020-08-19
      相关资源
      最近更新 更多