What does the memory profiler say?  There's a "tutorial" on how to use it on my 
blog.

Alex Harui
Flex SDK Developer
Adobe Systems Inc.<http://www.adobe.com/>
Blog: http://blogs.adobe.com/aharui

From: flexcoders@yahoogroups.com [mailto:flexcod...@yahoogroups.com] On Behalf 
Of Dharmendra Chauhan
Sent: Friday, June 26, 2009 10:21 PM
To: flexcoders@yahoogroups.com
Subject: [flexcoders] Memory Leak in DataServices based App ??





Hi All,

     I have  very basic application which uses  DataSerives over RTMP channel  
to populate dataGrid , I have not used any  user defined component.

This application has got LOAD data and Remove data  Button just to simulate the 
actual application

What happens , when I click on LOAD data , It  loads the data from 
server(JBOSS) then I Remove all the data and force the GC to run

If I continuously keep loading and removing the  data ,  memory goes up every 
time and after some times It reaches to threshold and  finally crashes the 
Browser.

In actual application as soon as user logs in a dedicated DS destination is 
created..

     private function createDestination(destName:String):void{
            var remoteServi! ce:RemoteObject = new 
RemoteObject("DestinationManager");
            remoteService.addEventListener(ResultEvent.RESULT, 
resultHandler,false,0,true);
            var operation:AbstractOperation = 
remoteService.getOperation("createDestination");
            operation.send(destName);
            var cs:ChannelSet = new ChannelSet();
            var rtmpChannel:RTMPChannel = ServerConfig.getChannel("my-rtmp") as 
 RTMPChannel;
            cs.addChannel(rtmpChannel);
          ! ;  tradeService = new DataService() ;
  ! ; & nbsp;        tradeService.destination=destName;
            tradeService.channelSet = cs;
        }


Now when user hits on Load data button to load the trade data ...

   public function loadData():void
        {
        var remoteService:RemoteObject  = new RemoteObject("filterRemoteVO");
        var operation:AbstractOperation = 
remoteService.getOperation("loadData");
        tradeService.fill(tradeCollection);
        operation.send(rowData.t! ext ,GUIID);
        tradeList.dataProvider = tradeCollection;

        }


Remove Data  hit I clean all the resource and released collection :-

     public  function  removeAll():void{
        if(tradeList.dataProvider){
             tradeCollection.source = new Array();
             tradeList.dataProvider.source = new Array();
             tradeList.dataProvider = null;
        }
           tradeService.release();
       &nb! sp;  ; tradeService.releaseCollection(tradeCollection);
         tradeService.channelSet.disconnectAll();
         tradeService.disconnect();
          tradeService.logout();
          System.gc();
        }

Except these 3 function I don't have any code which could cause memory leak.

I m using

 *   LCDS 2.5
 *   Flex 3.0
 *   JBoss4.2

Please see the mxml file below   , If  possible please have a look at it , I 
might  not be using dataSerice API correctly.

I have been trying to solve this leak for last two week , I really need help 
from you guys.
My client has already evaluating other contemporary technology because of this 
memory issue.

I have al! so created scalled down war file which can be deployed on any  java 
application server.Just provide your emial Id , Iwill send that to you.

Any help will greatly be appreciated

Regards,

Dam
######################## MXML##########################


<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"; layout="absolute"
     creationComplete="init();" height="100%" width="100%"
    >
    <mx:Script >
    <![CDATA[
        import mx.containers.GridRow;
          import mx.utils.Base64Decoder;
        import mx.utils.StringUtil;
           import mx.events.Colle! ctionEvent;
       ! import mx.formatters.Formatter;
        import mx.events.ResizeEvent;
        import mx.controls.DataGrid;
        import mx.effects.Fade;
        import mx.events.DataGridEvent;
        import mx.utils.ObjectUtil;
        import mx.events.ScrollEvent;
      import mx.formatters.DateFormatter;
      import mx.events.ListEvent;
      import mx.data.mxml.DataService;
      import mx.messaging.config.ServerConfig;
      import mx.messaging.channels.RTMPChannel;
      import mx.messaging.ChannelSet;
    &n! bsp; import mx.rpc.AbstractOperation;
      import mx.rpc.remoting.RemoteObject;
      import mx.collections.ArrayCollection;
      import mx.controls.Alert;
      import mx.rpc.events.ResultEvent;
      import mx.messaging.messages.*;
      import mx.messaging.events.*;
      import mx.controls.Alert;



       private var GUIID:String;
       private var lastRollOverIndex:Number;

       public var tradeService:DataService=null;
       public var tradeCollection:ArrayCollection = new ArrayCollection();

     ! public var flag:Boolean = false;
    &! nbsp;&nb sp;

       private function init():void {
          var guiId:String ="TEST";
           createDestination(GUIID);

      }

       public function getData():void{

            // memory.text =""+ ((System.totalMemory / 1024)/1024);

       }
       public function releaseDataServices():void {
          //  tradeService.fill(nul! l);
               tradeService.release();
              // tradeService.releaseCollection(tradeCollection);
              tradeService.channelSet.disconnectAll();
               tradeService.disconnect();
               tradeService.logout();
               //tradeService.dataStore = null;
       }
               /*Function for creating destination*/
    &nb! sp;    private function createDestination(! destName :String):void{
            var remoteService:RemoteObject = new 
RemoteObject("DestinationManager");
            remoteService.addEventListener(ResultEvent.RESULT, 
resultHandler,false,0,true);
            var operation:AbstractOperation = 
remoteService.getOperation("createDestination");
            operation.send(destName);
            var cs:ChannelSet = new ChannelSet();
            var rtmpChannel:RTMPChannel = ServerConfig.getChannel("my-rtmp") as 
RTMPChannel;
            cs! .addChannel(rtmpChannel);
            tradeService = new DataService() ;
            tradeService.destination=destName;
            tradeService.channelSet = cs;
        }

        //This function calls dataservice fill method depending on wheather 
destination is created or not
       private function resultHandler(event:ResultEvent):void{
          //call data service as destination is created successfully
           var status:Boolean = event.result as Boolean
       ! ;   // Alert.show("status="+status);            if(status){

            getData();
          }
          else{
              //TODO report error to MATS app
          }
       }
     public  function  removeAll():void{
        if(tradeList.dataProvider){
             tradeCollection.source = new Array();
             tradeList.dataProvider.s! ource = new Array();
             tradeList.dataProvider = null;
        }
           tradeService.release();
          // tradeService.releaseCollection(tradeCollection);
         tradeService.channelSet.disconnectAll();
         tradeService.disconnect();
          tradeService.logout();
          System.gc();
        }


      public function loadData():void
   &nb! sp;    {      &nb! sp;  ;
        var remoteService:RemoteObject  = new RemoteObject("filterRemoteVO");
        var operation:AbstractOperation = 
remoteService.getOperation("loadData");
        tradeService.fill(tradeCollection);
        operation.send(rowData.text ,GUIID);
        tradeList.dataProvider = tradeCollection;

        }

  ]]>
</mx:Script>


     <mx:DataGrid   id="tradeList"
            initialize="tradeList.dataProvider = tradeCollection" 
horizontalScrollPolicy="auto"
 &nbs! p;            height="659" x="0" y="84">

           <mx:columns>
                <mx:DataGridColumn  headerText="Security Description" 
dataField="securityDesc"
                 />
                <mx:DataGridColumn  headerText="B/S" dataField="transactionType"
                />
                <mx:DataGridColumn  headerText="Amount" dataField="amount"
        &nbs! p;       />
  &n! bsp;&nbs p;            <mx:DataGridColumn  headerText="Price Text" 
dataField="priceText"
                />
                <mx:DataGridColumn  headerText="Counterparty" 
dataField="counterParty"
                />
                <mx:DataGridColumn  headerText="Trade Date" 
dataField="tradeDate"
                />
                <mx:DataGridColumn  headerText="Settle Date" 
dataField="settleDate"
                />
                <mx:DataGridColumn  headerText="Trade Status" 
dataField="tradeStatusId"
                />
                <mx:DataGridColumn  headerText="Trader" dataField="trader"
                />
                <mx:DataGridColumn  headerText="Salesperson" 
dataField="salesperson"
                />
        &! nbsp;       <mx:DataGridColum! n  headerText="Ticket Number" 
dataField="tradeNumber"
                />
                <mx:DataGridColumn  headerText="Entry Date" 
dataField="tradeTime"
                />
                <mx:DataGridColumn  headerText="Cancel Date" 
dataField="cancelDate"
                />
                <mx:DataGridColumn  headerText="Cancel Time" 
dataField="cancelTime"
              &nb! sp; />



            </mx:columns>
         </mx:DataGrid >
        <mx:Grid x="149" y="23" width="995">
                <mx:GridRow width="100%" height="100%">
                           <mx:GridItem width="100%" height="100%">
                                <mx:Label text="Enter No of obejcts"   
width="111"/>
              &nbs! p;         </mx:Gri! dItem> ;
                        <mx:GridItem width="100%" height="100%">
                                <mx:TextInput name="row" id="rowData"   
width="97"/>
                        </mx:GridItem>
                        <mx:GridItem width="100%" height="100%">
                             !    <mx:Button  label="Load Data" 
click='loadData()'/>
                        </mx:GridItem>
                        <mx:GridItem width="100%" height="100%">
                                <mx:Button  label="removeAll" 
click='removeAll()'/>
                        </mx:GridItem>
                     &! nbsp;  <mx:GridItem width="100%" height="100%">! ;
&nb sp;                               <mx:Label text="Total Memory"/>
                        </mx:GridItem>
                        <mx:GridItem width="100%" height="100%">
                                <mx:TextInput text="Total Memory" id="memory"   
width="97"/>
                        &! lt;/mx:GridItem>
                        <mx:GridItem width="100%" height="100%">
                                <mx:Label text="Grid Row Count"/>
                        </mx:GridItem>
                        <mx:GridItem width="100%" height="100%">
                              &nbs! p; <mx:TextInput name="GridRowCountN" 
id="GridRowCount! " & nbsp; width="97"/>
                        </mx:GridItem>
                </mx:GridRow>



        </mx:Grid>


</mx:Application>




Reply via email to