【问题标题】:iOS Low Memory Crash, but very low memory usageiOS 低内存崩溃,但内存使用率非常低
【发布时间】:2011-08-24 06:00:51
【问题描述】:

这个问题困扰了我很久。我的应用程序运行占用了大约 2.74MB 的内存。没关系。但是当它创建一个 UIWebView 时,它会上升到大约 5.87MB 并继续崩溃。这些是在我的第一代 iPad 上运行时在 Instruments 中的 Live Bytes 下给出的值。

我找不到崩溃日志。以下来自控制台:

MyApp[1205] <Warning>: Received memory warning. Level=1
MyApp[1205] <Warning>: applicationDidReceiveMemoryWarning
SpringBoard[30] <Warning>: Received memory warning. Level=1
MobileMail[1199] <Warning>: Received memory warning. Level=1
configd[26] <Notice>: jetsam: kernel memory event (95), free: 428, active: 1853, inactive: 1011, purgeable: 338, wired: 15122
configd[26] <Notice>: jetsam: kernel termination snapshot being created
com.apple.launchd[1] <Notice>: (UIKitApplication:com.apple.mobilemail[0x8966]) Exited: Killed: 9
com.apple.launchd[1] <Notice>: (UIKitApplication:com.MyApp.MyApp[0xdd4f]) Exited: Killed: 9
SpringBoard[30] <Warning>: Application 'Mail' exited abnormally with signal 9: Killed: 9
kernel[0] <Debug>: launchd[1207] Builtin profile: MobileMail (sandbox)
SpringBoard[30] <Warning>: Application 'MyApp' exited abnormally with signal 9: Killed: 9
configd[26] <Debug>: CaptiveNetworkSupport:UIAllowedNotifyCallback:70 uiallowed: false
ReportCrash[1206] <Error>: libMobileGestalt loadBasebandMobileEquipmentInfo: CommCenter error: 1:45
ReportCrash[1206] <Error>: libMobileGestalt copyInternationalMobileEquipmentIdentity: Could not get mobile equipment info dictionary
ReportCrash[1206] <Error>: Saved crashreport to /Library/Logs/CrashReporter/LowMemory-2011-05-12-160645.plist using uid: 0 gid: 0, synthetic_euid: 0 egid: 0

我已删除所有对 imageNamed 的调用,将自动释放的内容更改为分配/释放。但我无法弄清楚为什么会发生这种情况,这让我发疯。

感谢您的帮助!

【问题讨论】:

  • 您的应用似乎没有崩溃,它正在被终止以释放内存。发生这种情况时它是否在前台?
  • 是的,它一直在前台。该应用程序打开,使用 2.74MB,然后我点击打开一个 UIWebView,它将使用量增加到 5.87MB,然后在几秒钟内被杀死。它发生在任何正在加载的模糊复杂的网页上。
  • 我认为 5.87mb 没什么大不了的。我的猜测是视图控制器正在被卸载,这会导致其他问题。在视图控制器中尝试 NSLogs 或调试 viewDidUnload。
  • 实际上没有使用任何视图控制器。它几乎只是一个带有 UITableView、UIView 和 UIWebView 的 UIView。
  • 会不会与 NSArray 有 50 个左右的 CTFrameRefs 结合 UIWebView 导致系统用完分配给图形的内存?

标签: iphone objective-c ios ipad memory-management


【解决方案1】:

几乎可以肯定,您使用的内存比您想象的要多。

你必须做什么才能看到你的应用真正使用了什么并不明显,但是一旦你做了几次,你就会记住。

  1. 使用分配性能工具运行。
  2. 点击“Allocations”下的 VM Tracker“行”(在屏幕截图中)
  3. 点击“自动快照”

然后你会看到你的脏内存(在我的截图中当前是 20.34MB)。

这应该让您更好地了解您的应用退出的原因。你可能发生了一些大的泄漏。

祝你好运!

【讨论】:

  • 感谢保罗的提示!脏内存是常驻的 34MB 和虚拟的 67MB。当我展开它时,我看到几个 Core Animation 类型的行占据了很大比例,但没有其他熟悉的内容。有关如何进一步解决此问题的任何建议或想法?
  • 如果不了解您的应用程序的工作方式,这很难说,但一个好的起点是查看哪些资源被保留的时间可能比您需要的时间更长。将一些日志语句放在视图控制器的内存管理方法中,以查看它们是否/何时被卸载和/或释放。您可能会发现一些闲逛的时间比您认为的要长得多。然后你就可以找出原因了。
  • 例如,我为上面的屏幕截图运行的应用程序是一个带有包含各个页面的滚动视图的图画书应用程序。它只有 18 页,并且可以全部保留在内存中。但是我仍然有代码在页面到达我跟踪的“页面缓存队列”(只是一个数组)的末尾时卸载页面。如果页面被查看,它会转到数组的顶部。如果数组中的页数超过 x,则我删除页 x + 1 并释放内存。
【解决方案2】:

我有两件事要补充,可能会有所帮助:

  1. 正如之前的answer 中提到的,UIImage 的位图不考虑内存泄漏量告诉您您的应用程序正在使用!所以你可能有很多使用大量内存的 UIImages 没有显示在总数中。我的建议是使用 Allocations 来检查您的应用运行时创建和销毁的 UIImage 对象的数量。
  2. 正如this answer 中提到的,使用以下代码

    -(void) report_memory {
        struct task_basic_info info;
        mach_msg_type_number_t size = sizeof(info);
        kern_return_t kerr = task_info(mach_task_self(),
                                       TASK_BASIC_INFO,
                                       (task_info_t)&info,
                                       &size);
        if( kerr == KERN_SUCCESS ) {
            NSLog(@"Memory in use (in bytes): %u", info.resident_size);
        } else {
            NSLog(@"Error with task_info(): %s", mach_error_string(kerr));
        }
    }
    

查看操作系统为您的应用分配的内存量。这是您应用程序正在使用的内存的更准确数字。 (你需要#import "mach/mach.h")

干杯!

【讨论】:

    【解决方案3】:

    您快速按下该菜单按钮 2 次,您将看到该应用单击所有应用的 x,然后打开您需要的应​​用。

    【讨论】:

      猜你喜欢
      • 2012-05-07
      • 2012-07-22
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      相关资源
      最近更新 更多