This has been annoying me for a long time. My app runs taking up about 2.74MB of memory. That's fine. But then when it creates a UIWebView it goes up to around 5.87MB and proceeds to crash. Those are the values given under Live Bytes in Instruments while running on my 1st gen iPad.
很长一段时间这让我烦恼。我的应用程序运行占用大约2.74MB的内存。没关系。但是当它创建一个UIWebView时,它会上升到大约5.87MB并继续崩溃。这些是在我的第一代iPad上运行时在仪器中的Live Bytes下给出的值。
There is no crash log that I can find. The following is from the console:
我找不到崩溃日志。以下内容来自控制台:
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
I have removed all calls to imageNamed, changed autoreleased stuff to alloc/release. But I cannot work out why this is happening and it's driving me insane.
我已经删除了对imageNamed的所有调用,将自动释放的内容更改为alloc / release。但我无法弄清楚为什么会发生这种情况,这让我感到疯狂。
Thanks for any help!
谢谢你的帮助!
3 个解决方案
#1
51
You are almost certainly using a lot more memory than you think.
你几乎肯定会使用比你想象的更多的内存。
It's not obvious what you have to do to see what your app is really using, but once you do it a couple times, you'll remember.
你必须要做什么才能看到你的应用程序真正使用的是什么,但是一旦你做了几次,你就会记得。
- Run with the Allocations performance tool.
- 使用Allocations性能工具运行。
- Click the VM Tracker "row" under "Allocations" (in the screenshot)
- 单击“Allocations”下的VM Tracker“行”(在屏幕截图中)
- Click "Snapshot Automatically"
- 点击“自动快照”
Then you will see your Dirty memory (currently 20.34MB in my screenshot).
然后你会看到你的脏内存(我的截图中目前为20.34MB)。
This should give you a much better picture of why your app is getting quit. You probably hav some large leaking happening.
这可以让您更好地了解您的应用程序退出的原因。你可能发生了一些大的泄漏事件。
good luck!
祝你好运!
#2
22
I have two things to add that may help:
我有两件事要补充:
- As mentioned in a previous answer , the bitmat of a UIImage is not considered in amount of memory Leaks tells you your app is using! so you may have a lot of UIImages that are using a lot of memory buy not showing in the total. My recommendation is to use Allocations to check out the number of UIImage objects created and destroyed while your app runs.
- 正如之前的回答中所提到的,UIImage的bitmat不考虑内存量泄漏告诉你的应用程序正在使用!所以你可能有很多UIImages使用大量的内存购买没有显示在总数中。我的建议是使用Allocations来检查应用程序运行时创建和销毁的UIImage对象的数量。
-
As mentioned in this answer use the following code
如本答案中所述,请使用以下代码
-(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)); } }
to see the amount of memory the operating system has assigned your app. That is more accurate number on the memory you app is using. (You will need to #import "mach/mach.h")
查看操作系统为您的应用分配的内存量。这是您应用正在使用的内存上更准确的数字。 (你需要#import“mach / mach.h”)
cheers!
干杯!
#3
-4
You press that menu button 2 times fast you will see the app click the x for all the apps then open the ones you need.
您快速按下该菜单按钮2次,您将看到应用程序单击所有应用程序的x,然后打开您需要的应用程序。
#1
51
You are almost certainly using a lot more memory than you think.
你几乎肯定会使用比你想象的更多的内存。
It's not obvious what you have to do to see what your app is really using, but once you do it a couple times, you'll remember.
你必须要做什么才能看到你的应用程序真正使用的是什么,但是一旦你做了几次,你就会记得。
- Run with the Allocations performance tool.
- 使用Allocations性能工具运行。
- Click the VM Tracker "row" under "Allocations" (in the screenshot)
- 单击“Allocations”下的VM Tracker“行”(在屏幕截图中)
- Click "Snapshot Automatically"
- 点击“自动快照”
Then you will see your Dirty memory (currently 20.34MB in my screenshot).
然后你会看到你的脏内存(我的截图中目前为20.34MB)。
This should give you a much better picture of why your app is getting quit. You probably hav some large leaking happening.
这可以让您更好地了解您的应用程序退出的原因。你可能发生了一些大的泄漏事件。
good luck!
祝你好运!
#2
22
I have two things to add that may help:
我有两件事要补充:
- As mentioned in a previous answer , the bitmat of a UIImage is not considered in amount of memory Leaks tells you your app is using! so you may have a lot of UIImages that are using a lot of memory buy not showing in the total. My recommendation is to use Allocations to check out the number of UIImage objects created and destroyed while your app runs.
- 正如之前的回答中所提到的,UIImage的bitmat不考虑内存量泄漏告诉你的应用程序正在使用!所以你可能有很多UIImages使用大量的内存购买没有显示在总数中。我的建议是使用Allocations来检查应用程序运行时创建和销毁的UIImage对象的数量。
-
As mentioned in this answer use the following code
如本答案中所述,请使用以下代码
-(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)); } }
to see the amount of memory the operating system has assigned your app. That is more accurate number on the memory you app is using. (You will need to #import "mach/mach.h")
查看操作系统为您的应用分配的内存量。这是您应用正在使用的内存上更准确的数字。 (你需要#import“mach / mach.h”)
cheers!
干杯!
#3
-4
You press that menu button 2 times fast you will see the app click the x for all the apps then open the ones you need.
您快速按下该菜单按钮2次,您将看到应用程序单击所有应用程序的x,然后打开您需要的应用程序。