Tag: memory warning

MonoTouch:应用程序因低内存而被杀,为什么? 实时字节分配5 MB顶部

我的iPad应用程序是用MonoTouch开发的,因为我想避免所有的内存管理地狱,但事实并非如此。 在模拟器上一切正常,但是当我在设备上测试我的应用程序时,我惊恐地发现它在一些内存警告后很快被操作系统杀死了。 我的应用程序是一个简单的图像浏览器,它加载一些PNG图像并使用UIScrollView中的一些UIViews显示它们,在触摸时加载下一个或前一个。 在模拟器上它工作正常。 但是在加载和卸载大约6-11个图像后的设备上,它开始获得内存警告,然后突然该过程被杀死。 我检查了所有的实例循环,并在加载新图像之前正确删除了所有引用。 所以我启动了仪器并开始在iPad上分析我的应用程序的内存分配。 在那里,我发现Live字节只有大约5-9 MB,正如我所期望的那样,但由于一些奇怪的原因,死内存分配几乎完全没有收集,因为在分配了大约50 MB(小于5-9 MB的它是Live Bytes)它被杀了! 以下是我的应用程序的Instruments分析会话的屏幕截图: 这是快照序列: 还有一些小漏洞,但我认为它们不够大,不足以成为罪魁祸首。 它们都是来自strdup的48个字节泄漏,这是在iOS 5.1中发布UIScrollView时的一个已知问题: 即使一切看起来还不错,分配的Live Bytes仍然是5 MB,我的应用程序的REAL内存呈指数级增长,然后在iPad上被杀死高达50MB,而iPhone4S上的高达314 MB,如内存监视器所报告: 有人可以告诉我是否有方法或实用工具来发现问题的原因和位置? 这是一个单调垃圾收集器的错误吗? 还是有一些我没有正确处理的物体? 我怎么能用剖面仪找到那些? 我已经检查了两天我的代码,但一切似乎都正确。 这是我的加载/实例化/处置周期的代码: void StartImageLoadingThread() { tokenSource = new CancellationTokenSource (); token = tokenSource.Token; Task task1 = new Task( () => PerformLoadImageTask(token),token); task1.Start(); } void PerformLoadImageTask(CancellationToken token) { if (token.IsCancellationRequested) { […]