【问题标题】:Does OS X limit the memory usage of secondary threads?OS X 是否限制辅助线程的内存使用?
【发布时间】:2023-03-09 06:50:01
【问题描述】:

我必须执行一项繁重的任务。当我在主线程中运行它时,一切都很好,但是当我尝试从单独的线程运行任务时,出现的错误是“No memory available to program now: unsafe to call malloc强>”。

我正在使用+[NSThread detachNewThreadSelector:toTarget:withObject:],并在必要时放入所需的自动释放池(即在开始时分配并初始化它,然后在最后将其耗尽)。

我的问题是:辅助线程上是否存在内存限制(可能是堆栈内存被削减了?)?我尝试使用 Instruments 进行调试,但没有泄漏,应用程序只是崩溃了。

【问题讨论】:

  • 在调用 detachNewThread 之前你是在调用 autorelease 吗?如果是,则该对象已经在您的主线程中自动释放,然后您尝试从它已经消失的其他线程访问它。
  • @Maurício Linhares 不,我不是。实际上,应用程序中甚至没有一个调用 -autorelease。
  • 你为什么要说清空自动释放池?这是在新线程上吗?在您的项目上启用 NSZombie,它可能会对您有所帮助 -> cocoadev.com/index.pl?NSZombieEnabled
  • @Maurício Linhares NSAutoreleasePool 被放置在新线程中,最后我调用 -drain。我现在正在尝试使用僵尸,谢谢您的建议。
  • 您是否在线程上运行循环?如果是这样,请尝试在循环内部使用自动释放池。

标签: ios multithreading cocoa macos exc-bad-access


【解决方案1】:

我不知道这是否有帮助,但您可以尝试使用队列而不是 NSThreads。 link to Apple's documentation of "Migrating away from Threads".

【讨论】:

  • NSOperations 和 GCD 队列都在使用相同默认线程堆栈大小的线程上运行。所以这并不能解决这个问题,尽管它通常是一个更好的解决方案。
【解决方案2】:

查看 Apple 的文档,您可以使用 -setStackSize: 来增加堆栈大小。

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html

但是,您必须分配对象才能设置该属性。

【讨论】:

  • 如果他得到的错误是No memory available to program now: unsafe to call malloc,我想问题可能出在堆上。如果他的堆栈内存不足,他会得到堆栈溢出;-)
  • @Chaitanya Gupta 如果涉及到堆,我认为主线程会导致同样的问题。
【解决方案3】:

主线程有一个 1MB 的堆栈,辅助堆栈的默认堆栈大小为 512KB。

如果堆栈空间不足,您将收到此错误消息,并且由于它适用于主线程而不是辅助线程,我会说这正是您的问题。

如果可以的话,我的第一个建议是减少递归,因为 512KB 一开始就非常慷慨,而增加大小可能只会推迟你的麻烦。可能直到应用程序最终用户的手中疯狂地崩溃以获得 1 星评价。

如果您确实想要更大的堆栈,那么您必须自己实例化、配置和启动堆栈。像这样:

NSThread* t = [[NSThread alloc] initWithTarget:self
                                      selector:@selector(someSelector:)
                                        object:anArgument];
[t setStackSize:1024*1024];
[t start];

以 4K 为单位的最小堆栈大小,并且大小必须以 4K 为增量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多