理论上它应该永远运行.没有对大型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”?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)