xamarin.ios – 为什么这段代码会破坏iOS应用程序的“Out of Memory”?

xamarin.ios – 为什么这段代码会破坏iOS应用程序的“Out of Memory”?,第1张

概述我的问题最初是处理从磁盘加载的字符串和我的应用程序内存不足但有一个更简单的方法使它崩溃,我不明白为什么.运行下面的代码,它将在几秒钟内死亡(iPad 4.2). 理论上它应该永远运行.没有对大型StringBuilder保留引用,它立即设置为NULL. 如果我在Instruments中观看它,几次循环后内存会上升到160MB,应用程序就会死掉.为什么内存没有发布? 每个循环增加内存大约10MB … 我的问题最初是处理从磁盘加载的字符串和我的应用程序内存不足但有一个更简单的方法使它崩溃,我不明白为什么.运行下面的代码,它将在几秒钟内死亡(iPad 4.2).
理论上它应该永远运行.没有对大型StringBuilder保留引用,它立即设置为NulL.
如果我在Instruments中观看它,几次循环后内存会上升到160MB,应用程序就会死掉.为什么内存没有发布?
每个循环增加内存大约10MB ……

一个想法是GC无法跟上,但Thread.Sleep()的延迟有多大并不重要 – 最终,内存将消失.

测试看起来可能是学术性的,但我遇到了一个崩溃的真实应用程序的问题.它有一个方法从WebService请求中获取(巨大的)字符串,将该字符串转换为Xmldocument并解析它(将某些内容存储到DB).然后该方法退出但内存保持高位.如果我再次执行相同的方法(一小时后左右!),应用程序将死OOM.为什么仍然分配内存?

public overrIDe bool FinishedLaunching ( UIApplication app,NSDictionary options )        {            Thread oThread = new Thread ( DoIt );            oThread.Start (  );            return true;        }        public voID DoIt ()        {            using(var o = new NSautoreleasePool())            {                while(true)                {                    StringBuilder oSB = new StringBuilder();                    for(int i = 0; i < 800000; ++i)                    {                        oSB.Append("1234567890");                    }                    oSB = null;                    Thread.Sleep(1000);                }            }        }

编辑:我注意到如果我改变Do()方法如下所示,内存保持稳定.它上升了一段时间,然后GC开始并清理它.如果我在创建Nsstring对象后添加s.dispose(),内存根本就不会上升.
所以它似乎是.NET字符串类的问题.

public voID DoIt ()            {                using(var o = new NSautoreleasePool())                {                                StringBuilder oSB = new StringBuilder();                    for(int i = 0; i < 800000; ++i)                    {                        oSB.Append("1234567890");                    }                    while(true)                    {                            Nsstring s = new Nsstring(oSB.ToString());                          Thread.Sleep(1000);                    }                }            }
解决方法 StringBuilder在每次迭代时在内部分配新的更大的数组(它的大小可能会加倍).最终,您将最终得到一个碎片堆. 总结

以上是内存溢出为你收集整理的xamarin.ios – 为什么这段代码会破坏iOS应用程序的“Out of Memory”?全部内容,希望文章能够帮你解决xamarin.ios – 为什么这段代码会破坏iOS应用程序的“Out of Memory”?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1001372.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存