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 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;
}
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.text ,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();
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 also 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.CollectionEvent;
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;
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;
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(null);
tradeService.release();
// tradeService.releaseCollection(tradeCollection);
tradeService.channelSet.disconnectAll();
tradeService.disconnect();
tradeService.logout();
//tradeService.dataStore = null;
}
/*Function for creating destination*/
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.source = new Array();
tradeList.dataProvider = null;
}
tradeService.release();
// tradeService.releaseCollection(tradeCollection);
tradeService.channelSet.disconnectAll();
tradeService.disconnect();
tradeService.logout();
System.gc();
}
public function loadData():void
{
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"
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"
/>
<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"
/>
<mx:DataGridColumn 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"
/>
</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"/>
</mx:GridItem>
<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>
<mx:GridItem width="100%" height="100%">
<mx:Label text="Total Memory"/>
</mx:GridItem>
<mx:GridItem width="100%" height="100%">
<mx:TextInput text="Total Memory"
id="memory" width="97"/>
</mx:GridItem>
<mx:GridItem width="100%" height="100%">
<mx:Label text="Grid Row Count"/>
</mx:GridItem>
<mx:GridItem width="100%" height="100%">
<mx:TextInput name="GridRowCountN"
id="GridRowCount" width="97"/>
</mx:GridItem>
</mx:GridRow>
</mx:Grid>
</mx:Application>