作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题最初涉及从磁盘加载的字符串和我的应用程序内存不足的问题,但有一种更简单的方法可以使其崩溃,我不明白为什么。运行下面的代码,它会在几秒钟内死掉(iPad 4.2)。
理论上它应该永远运行。没有保留对大 StringBuilder 的引用,它会立即设置为 NULL。
如果我在 Instruments 中观看它,经过几次循环后内存会上升到 160MB,并且应用程序会死掉。为什么不释放内存?
每个循环增加大约 10MB 的内存......
一种想法是 GC 无法跟上,但 Thread.Sleep() 中的延迟有多大并不重要 - 最终,内存将消失。
该测试可能看起来很学术,但我遇到了崩溃的真实应用程序的问题。它有一个方法可以从 WebService 请求中获取(巨大的)字符串,将该字符串转换为 XmlDocument 并解析它(将某些内容存储到 DB)。然后该方法退出但内存保持高位。如果我再次执行相同的方法(大约一个小时后!),应用程序将死掉。为什么内存仍然分配?
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);
}
}
}
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 - 为什么此代码会导致 "Out Of Memory"的 iOS 应用程序崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4997276/
我是一名优秀的程序员,十分优秀!