相关疑难解决方法(0)

如何解决内存碎片问题

我们偶尔会遇到问题,即由于内存分配失败,我们长时间运行的服务器进程(在Windows Server 2003上运行)引发了异常.我们怀疑这些分配是由于内存碎片而失败的.

因此,我们一直在寻找一些可能对我们有帮助的替代内存分配机制,我希望有人可以告诉我最好的一个:

1)使用Windows 低碎片堆

2)jemalloc - 用于Firefox 3

3)Doug Lea的malloc

我们的服务器进程是使用跨平台的C++代码开发的,因此任何解决方案都可以理想地跨平台(do*nix操作系统会遭受这种类型的内存碎片吗?).

另外,我认为LFH现在是Windows Server 2008/Vista的默认内存分配机制吗?如果我们的客户只是升级他们的服务器操作系统,我当前的问题会"消失"吗?

c++ memory windows

45
推荐指数
3
解决办法
4万
查看次数

MonoTouch不稳定性仍在继续:托管内存分配器崩溃

简而言之:我可以分配大量非托管内存,但尝试在托管内存中分配相同数量(或更少)会导致GC_remap中的MonoTouch崩溃(下面的callstack).

细节:

我将谈谈上面描述的行为的一个例子.我的应用程序偶尔会分配一个2.5MB大小的托管内存(使用新的byte []),并且它经常在我的iPhone4上死掉,下面粘贴了callstack(即分配期间的mprotect错误).我没有比单个函数调用更长时间地引用这些2.5MB块.

MonoTouch的人说'mprotect errno 12'意味着你已经耗尽了设备上的内存,但问题是,我的应用程序可以使用大量内存.我可以在我的应用启动时分配0MB,10MB200MB非托管内存(使用Marshal.AllocHGlobal),每帧都触摸它,它对我的​​应用程序的行为或此mprotect错误的频率没有区别.

一些笔记

  • GC.TotalMemory告诉我,我的应用程序一直处于3MB5MB的托管内存使用量之间.
  • 我在我的应用程序中有其他地方,我正在分配更大的非托管内存块,它永远不会在那里崩溃.我创建了压力测试,加载4MB(非托管)纹理数据,将其交给GL,并在每一帧绘制它,应用程序坚如磐石,直到我开始要求大块的托管内存.
  • 除非我自己调用GC.Collect,否则GC.CollectionCount几乎没有变化.
  • MonoTouch 3.2.3以及MonoTouch 4.0也会出现同样的情况.
  • 所有测试设备(iPhone 3G,3GS,4,iPad,iPad2)都会出现同样的情况.
  • 在发布版本和调试版本中也会发生相同的行为,尽管调试版本会更频繁地发生.

引发崩溃的方法

  • 如果我创建一个循环调用GC.Collect,然后休眠1ms,这会使崩溃更快发生(即,如果我在调试版本中,几乎立即).
  • 使用某些.NET功能(如WebRequest)也会导致此崩溃.我只能假设它在那里的某个地方分配大块的托管内存.

崩溃的方式

有两种方法可以减少崩溃的频率或完全修复它:

  1. 如果我预先分配2.5MB大小的托管内存,然后在应用程序的生命周期中保留它,那么就不会崩溃.
  2. 如果我在做任何事情之前将2.5MB的内存固定,那么这似乎有所帮助.

结论/问题

由于这个问题,我们尚未在我们的应用程序中实现完全稳定性.这个崩溃(总是在GC_remap中)发生在我们整个应用程序的随机分配中(我在这里的2.5MB示例就是我选择隔离和重新编写的那个).

问题:

  1. 我根本不信任托管分配器吗?
  2. 为什么我可以分配200MB的非托管内存,但是当我要求2.5MB时,托管分配器会死掉?(注意:即使我没有分配200MB的非托管内存,当我要求2.5MB时也会死掉).
  3. 为什么如果我在应用程序的生命周期内占用2.5MB这个应用程序是完全正常的,但是如果我把它还给系统(并调用GC.Collect)并要求另外2.5MB以后,那么崩溃就更糟了!如果这确实是一个内存不足的情况,那么给系统回馈2.5MB是不是更好呢?

我们甚至可以使用MonoTouch吗?

我的团队正在认真考虑放弃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)

iphone-sdk-3.0 xamarin.ios ios4

8
推荐指数
1
解决办法
1023
查看次数

MonoTouch - WebRequest内存泄漏和崩溃?

我有一个使用3.5MB文件进行HTTP POST的MonoTouch应用程序,它在我测试的主要平台上非常不稳定(带有OS 3.1.2的iPhone 3G和带有OS 4.2.1的iPhone 4).我会描述我在这里做的事情,也许有人可以告诉我,如果我做错了什么.

为了排除我的应用程序的其余部分,我将其缩小为一个小样本应用程序.该应用程序是一个iPhone OpenGL项目,它只做这个:

  1. 在启动时,以30k块分配6MB内存.这模拟了我的应用程序的内存使用情况.
  2. 将3.5MB文件读入内存.
  3. 创建一个帖子来发布数据.(创建一个WebRequest对象,使用GetRequestStream(),然后写入3.5MB数据).
  4. 当主线程检测到发布线程完成时,转到步骤2并重复.

此外,每个帧,我分配0-100k来模拟应用程序做某事.我没有保留对这些数据的任何引用,所以应该收集垃圾.

iPhone 3G结果:该应用程序上传了6​​到8次,然后操作系统将其杀死.没有崩溃日志,但有一个LowMemory日志显示该应用程序已被丢弃.

iPhone 4结果:第11次上传时出现Mprotect错误.

一些数据点:

  • 随着应用程序继续上传,仪器不显示内存增加.
  • 仪器没有显示任何重大泄漏(总共1千字节).
  • 使用一个Stream.Write()调用是以64k块还是一次性写入后置数据并不重要.
  • 在开始下一次上传之前,我是否等待响应(HttpWebRequest.HaveResponse)并不重要.
  • POST数据是否有效无关紧要.我尝试使用有效的POST数据,我尝试发送3MB的零.
  • 如果应用程序没有为每个帧分配任何数据,那么内存耗尽需要更长的时间(但如前所述,我分配每个帧的内存在分配它的帧之后没有被引用,所以它应该是由GC舀起来).

如果没有人有任何想法,我会向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)

memory-leaks webrequest xamarin.ios

5
推荐指数
1
解决办法
1067
查看次数

iPhone应用程序崩溃与Mprotect失败错误(MonoTouch)

使用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)

iphone wcf mprotect xamarin.ios

2
推荐指数
1
解决办法
791
查看次数