ASP.NET web服务导致Adobe Flex/AIR应用程序内存泄漏

ASP.NET web服务导致Adobe Flex/AIR应用程序内存泄漏,asp.net,ios,apache-flex,air,adobe,Asp.net,Ios,Apache Flex,Air,Adobe,我们为一款新发布的软件产品发布了一款基本的iOS应用程序(使用FB4.6的AdobeFlex/AIR构建),我的任务是对该应用程序进行增强,使其功能更加完善 我已经做了很多改进,在这一过程中取得了不同程度的成功。但是,我离题了 我在应用程序中发现了一个严重的内存泄漏,直到现在才被发现 该应用程序的初始版本并没有做很多工作,对于大多数目的来说都是足够的。但现在它包含了更多的功能,我在测试中注意到它在iPad上有点迟钝。我认为这是一个设备问题,并猜测第一代iPad不如较新的iPad强大 我们在同事的

我们为一款新发布的软件产品发布了一款基本的iOS应用程序(使用FB4.6的AdobeFlex/AIR构建),我的任务是对该应用程序进行增强,使其功能更加完善

我已经做了很多改进,在这一过程中取得了不同程度的成功。但是,我离题了

我在应用程序中发现了一个严重的内存泄漏,直到现在才被发现

该应用程序的初始版本并没有做很多工作,对于大多数目的来说都是足够的。但现在它包含了更多的功能,我在测试中注意到它在iPad上有点迟钝。我认为这是一个设备问题,并猜测第一代iPad不如较新的iPad强大

我们在同事的iPad3上测试了这个应用程序,发现了同样的速度问题。我通过FB的profiler运行了这个应用程序,发现它似乎占用了大量内存。诚然,这个应用程序是针对移动平台的,分析器是在Windows的Flash Player中运行这个应用程序的,但我认为这就是问题所在

应用程序中出现的第一个视图只是一个登录屏幕。当应用程序启动时,我看到了这个图表,内存使用率一直徘徊在很低的水平,然后突然,它飙升到120MB。这是没有用户输入的。登录或切换视图会使使用量增加一倍,甚至三倍,而且永远不会下降

我承认,也许我没有意识到资源的使用,因为我应该,但我一直在试图清除对象,如我去

大多数后端功能都是通过调用ASP.NET中编写的web服务来完成的。使用web服务向导将web服务插入到Flash Builder中…例如URL是

第一个“主”视图不会调用任何web服务函数,除非用户实际执行了某些操作,例如按下按钮。我从视图的“fx:Declarations”部分取出web服务声明,并注释掉对它的任何引用,然后再次尝试探查器

这一次,使用上限为2MB。这是天文学上的差异

分析器显示99%的内存被“XML”类使用,这让我相信web服务是问题所在。看起来视图似乎是在启动时查询web服务,并为此使用了大量内存

我是不是遗漏了什么?有没有更有效的方法从AIR应用程序调用web服务?我做错了什么


提前谢谢

我想我终于明白了

这篇文章是为可能遇到同样问题的其他人提供的公共服务

我不知道为什么web服务会导致这样的内存使用高峰,但我能够解决这个问题。在我的例子中,使用率仍然会猛增到略低于120MB,但不同的是,当我切换视图时,它不会像以前那样增加两倍/三倍

艾米把我引向了正确的方向,这要归功于她。我基本上把所有声明等都放到web服务中,并在应用程序MXML文件中公开声明,就像这样

public var ws:WebService = new WebService();

protected function viewnavigatorapplication1_preinitializeHandler(event:FlexEvent):void
{
    ws.loadWSDL("http://www.mydomain.com/MyWebService.asmx?WSDL");
}
那么在你看来

private var serviceOperation:AbstractOperation;
private var myToken:AsyncToken;

private function getData():void
{
    var firstName:String = "John";
    var lastName:String = "Smith";        

    serviceOperation = this.parentApplication.ws.getOperation("MyFunction");
    serviceOperation.addEventListener(FaultEvent.FAULT, fault);
    serviceOperation.addEventListener(ResultEvent.RESULT, result);

    myToken = serviceOperation.send(firstName, lastName);
}

public function result(data:Object):void
{
    switch(data.token)
    {
        case myToken:
            processResults(data);
            break;
        default:
            break;
    }
}
显然,请确保删除事件侦听器,并在使用完对象引用后将其设置为null。为了安全起见,我这样做是为了代币和手术


我还没有对应用程序的内存使用情况进行彻底测试,但乍一看,它并没有呈指数级增长,我相信当垃圾收集开始时,我甚至看到了它的下降。

我想我终于找到了答案

这篇文章是为可能遇到同样问题的其他人提供的公共服务

我不知道为什么web服务会导致这样的内存使用高峰,但我能够解决这个问题。在我的例子中,使用率仍然会猛增到略低于120MB,但不同的是,当我切换视图时,它不会像以前那样增加两倍/三倍

艾米把我引向了正确的方向,这要归功于她。我基本上把所有声明等都放到web服务中,并在应用程序MXML文件中公开声明,就像这样

public var ws:WebService = new WebService();

protected function viewnavigatorapplication1_preinitializeHandler(event:FlexEvent):void
{
    ws.loadWSDL("http://www.mydomain.com/MyWebService.asmx?WSDL");
}
那么在你看来

private var serviceOperation:AbstractOperation;
private var myToken:AsyncToken;

private function getData():void
{
    var firstName:String = "John";
    var lastName:String = "Smith";        

    serviceOperation = this.parentApplication.ws.getOperation("MyFunction");
    serviceOperation.addEventListener(FaultEvent.FAULT, fault);
    serviceOperation.addEventListener(ResultEvent.RESULT, result);

    myToken = serviceOperation.send(firstName, lastName);
}

public function result(data:Object):void
{
    switch(data.token)
    {
        case myToken:
            processResults(data);
            break;
        default:
            break;
    }
}
显然,请确保删除事件侦听器,并在使用完对象引用后将其设置为null。为了安全起见,我这样做是为了代币和手术


我还没有对应用程序的内存使用情况进行彻底测试,但乍一看,它并没有呈指数级增长,而且我相信当垃圾收集开始时,我甚至看到它下降了。

我刚刚编辑了我的帖子……我以为没有web服务时,内存使用量是20MB,但我错了。重新打开FB,发现只有2MB!!没有审查您的特定代码;很难为您提供任何其他信息。对web服务进行注释可能会导致应用程序使用的内存少于未使用的应用程序。你能想出web服务导致大量内存使用的任何原因吗?见鬼,我不在乎内存使用率是否有点高。我想做的就是堵住漏洞(如果确实存在漏洞),让用户看到应用程序流畅地切换视图。现在,当更改视图时,它会像疯了一样抖动。我不建议“按原样”使用生成的代码。首先,它不允许您集中服务层,而是鼓励您在每个视图中嵌入服务实例。到目前为止,你做了什么来克服这个问题?我想不出为什么一个从未调用过的web服务实例会导致大量内存使用。我刚刚编辑了我的文章…我认为没有web服务的情况下使用的内存是20MB,但我错了。重新打开FB,发现只有2MB!!没有审查您的特定代码;很难提供更多的信息