我们偶尔会遇到问题,即由于内存分配失败,我们长时间运行的服务器进程(在Windows Server 2003上运行)引发了异常.我们怀疑这些分配是由于内存碎片而失败的.
因此,我们一直在寻找一些可能对我们有帮助的替代内存分配机制,我希望有人可以告诉我最好的一个:
1)使用Windows 低碎片堆
2)jemalloc - 用于Firefox 3
3)Doug Lea的malloc
我们的服务器进程是使用跨平台的C++代码开发的,因此任何解决方案都可以理想地跨平台(do*nix操作系统会遭受这种类型的内存碎片吗?).
另外,我认为LFH现在是Windows Server 2008/Vista的默认内存分配机制吗?如果我们的客户只是升级他们的服务器操作系统,我当前的问题会"消失"吗?
简而言之:我可以分配大量非托管内存,但尝试在托管内存中分配相同数量(或更少)会导致GC_remap中的MonoTouch崩溃(下面的callstack).
细节:
我将谈谈上面描述的行为的一个例子.我的应用程序偶尔会分配一个2.5MB大小的托管内存(使用新的byte []),并且它经常在我的iPhone4上死掉,下面粘贴了callstack(即分配期间的mprotect错误).我没有比单个函数调用更长时间地引用这些2.5MB块.
MonoTouch的人说'mprotect errno 12'意味着你已经耗尽了设备上的内存,但问题是,我的应用程序可以使用大量内存.我可以在我的应用启动时分配0MB,10MB或200MB的非托管内存(使用Marshal.AllocHGlobal),每帧都触摸它,它对我的应用程序的行为或此mprotect错误的频率没有区别.
有两种方法可以减少崩溃的频率或完全修复它:
由于这个问题,我们尚未在我们的应用程序中实现完全稳定性.这个崩溃(总是在GC_remap中)发生在我们整个应用程序的随机分配中(我在这里的2.5MB示例就是我选择隔离和重新编写的那个).
问题:
我的团队正在认真考虑放弃MonoTouch用于我们的产品,因为我们无法让它稳定可靠.
我们也无法从MonoTouch团队获得堆栈溢出,在Novell网站上提交错误,或直接通过电子邮件发送MonoTouch的支持电子邮件.我们已将(托管和非托管)内存使用量减少到荒谬的低点,但由于此问题,应用程序仍然崩溃.
在短期内,我想到的唯一解决方法是在启动时分配一大块内存(2-5MB),将其设为PIN,以便垃圾收集器永远不会触及它,并编写我自己的分配器来分配部分内存.这个内存块根据需要阻止我的应用程序.但如果这是MonoTouch下可能的最佳解决方案,那么只要我能从MonoTouch获得逃逸速度,我就会想要我的钱.
...
Mprotect failed at 0xaa00000 (length 3801088) with errno 12
Stacktrace:
at MyApp.GameScreen/VerifyPictureDialog.StoreBasePictureData () [0x00000] in /Users/dussault/s/MyApp/Main/Src/PhotoScreens.cs:428
at MyApp.GameScreen/VerifyPictureDialog.ApplyFilters (bool) [0x0004b] …Run Code Online (Sandbox Code Playgroud) 我有一个使用3.5MB文件进行HTTP POST的MonoTouch应用程序,它在我测试的主要平台上非常不稳定(带有OS 3.1.2的iPhone 3G和带有OS 4.2.1的iPhone 4).我会描述我在这里做的事情,也许有人可以告诉我,如果我做错了什么.
为了排除我的应用程序的其余部分,我将其缩小为一个小样本应用程序.该应用程序是一个iPhone OpenGL项目,它只做这个:
此外,每个帧,我分配0-100k来模拟应用程序做某事.我没有保留对这些数据的任何引用,所以应该收集垃圾.
iPhone 3G结果:该应用程序上传了6到8次,然后操作系统将其杀死.没有崩溃日志,但有一个LowMemory日志显示该应用程序已被丢弃.
iPhone 4结果:第11次上传时出现Mprotect错误.
一些数据点:
如果没有人有任何想法,我会向Novell提交一个错误,但我想先看看我是否做错了.
如果有人想要完整的示例应用程序,我可以提供它,但我已经粘贴了下面的EAGLView.cs的内容.
using System;
using System.Net;
using System.Threading;
using System.Collections.Generic;
using System.IO;
using OpenTK.Platform.iPhoneOS;
using MonoTouch.CoreAnimation;
using OpenTK;
using OpenTK.Graphics.ES11;
using MonoTouch.Foundation;
using MonoTouch.ObjCRuntime;
using MonoTouch.OpenGLES;
namespace CrashTest
{
public partial class EAGLView : iPhoneOSGameView
{
[Export("layerClass")]
static Class LayerClass ()
{
return iPhoneOSGameView.GetLayerClass ();
}
[Export("initWithCoder:")]
public EAGLView (NSCoder coder) : base(coder)
{ …Run Code Online (Sandbox Code Playgroud) 使用MonoTouch开发的iPhone应用程序出现问题.
我正在开发一个联系WCF服务的应用程序,当WCF服务回复时,我用返回的数据更新UITableView,完成后它会发送一个新的WCF异步调用,当它回复时它再次更新表等等.
问题是,当它在不同的时间内完成此操作时,它会因Mprotect失败错误12而崩溃.只有当应用程序直接在手机上运行而不是在模拟器中运行时才会发生这种情况.
我试图在表的更新发生的地方发表评论,并在将下一个Async请求发送到WCF服务之前创建一个Thread.Sleep(1000),但仍然是相同的错误,但是可以运行更长时间而没有失败.
我通过"代理"文件联系WCF服务,该文件由SlSvcUtil.exe/noConfig生成http://mydomain/myservice.svc
我的问题是,可以通过某种方式避免此错误,也可能使用解决方法?这是我的错,还是一个错误?这实际上是因为我将在最后的学校项目中使用该应用程序,所以如果我可以修复它可能会很好.
我发布了控制台输出,以及崩溃报告中的一部分,但如果您需要更多信息请告诉我,我会发布它.我不是专业人士使用Mono或MonoTouch环境这是我第一次,所以详细的回答会很好.
控制台输出:
Mon Dec 27 20:37:17 tests-iPhone UIKitApplication:dk.test.iphone[0x1c3c][625] <Notice>: Mprotect failed at 0xa09a000 (length 1052672) with errno 12
Mon Dec 27 20:37:17 tests-iPhone UIKitApplication:dk.test.iphone[0x1c3c][625] <Notice>: Stacktrace:
Mon Dec 27 20:37:17 tests-iPhone UIKitApplication:dk.test.iphone[0x1c3c][625] <Notice>: at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication.UIApplicationMain (int,string[],intptr,intptr) <0xffffffff>
Mon Dec 27 20:37:17 tests-iPhone UIKitApplication:dk.test.iphone[0x1c3c][625] <Notice>: at MonoTouch.UIKit.UIApplication.Main (string[],string,string) <0x000e0>
Mon Dec 27 20:37:17 tests-iPhone UIKitApplication:dk.test.iphone[0x1c3c][625] <Notice>: at MonoTouch.UIKit.UIApplication.Main (string[]) <0x00023>
Mon Dec 27 20:37:17 tests-iPhone UIKitApplication:dk.test.iphone[0x1c3c][625] <Notice>: at iPhoneStdView.Application.Main (string[]) <0x0001b>
Mon …Run Code Online (Sandbox Code Playgroud) xamarin.ios ×3
c++ ×1
ios4 ×1
iphone ×1
memory ×1
memory-leaks ×1
mprotect ×1
wcf ×1
webrequest ×1
windows ×1