Hey,
after taking a quick look at your code, I did see that you are not properly 
disposing the data array. The lines
                                this._disposeArray("old");
                                delete old;
                                old = null;
should all be replaced by a single
                                old.dispose();
which should be enough. If the data array is generated by a store, disposing it 
should also dispose its children which is exactly what you need. After that, 
your models should be clean. If there is still a memory leak, you should find 
out what kind of objects are leaking by checking the object registry 
(qx.core.ObjectRegistry).
Regards,
Martin


Am 20.03.2013 um 04:27 schrieb Nathanial Byrnes <[email protected]>:

> Hello,
>       I have a class (DataTable) that extends Window whose only widget is a 
> table. DataTable has a property called data that is bound to a JSON data 
> store. I have an interval timer set up that triggers a refresh of the data 
> store. The property data has an apply function which sets the table's 
> tablemodel data, which causes the table to display the newly fetched data. 
> The problem I am having is that with a refresh rate of every few seconds, the 
> browser memory consumption continually grows. This application is intended to 
> be left running on status displays indefinitely. The code for my DataTable 
> class is below. I am attempting some memory clean up (as you will see) which 
> I am assuming is incorrect as it is not preventing the memory growth. I am 
> hoping someone can point me in the correct direction to prevent the memory 
> consumption I am seeing. I suspect that some data structures are still linked 
> to DOM nodes and therefore preventing garbage collection, but am not well 
> versed enough to dig into that theory...
> 
>       Thanks in Advance,
>       Nate
> 
> qx.Class.define("edcwebapp.DataTable", 
> {
>       extend: edcwebapp.BaseWindow,
>       properties: {
>               winTitle: {
>                       init: "Table Data"
>               },
>               columnHeaders: {
>                       init: ["A", "B" ],
>                       apply: "setColHeads"
>               },
>               dbSessionId: {
>                       nullable: true,
>                       init: null
>               },
>               pullUrl: {
>                       init: "/get_data"
>               },
>               refreshDelay: {
>                       nullable: false,
>                       init: 5
>               },
>               data: {
>                       nullable: true,
>                       init: null,
>                       apply: "applyData"
>               },
>               tableModel: {
>                       nullable: true,
>                       init: null
>               },
>               table: {
>                       nullable: true,
>                       init: null
>               }
>       },
>       construct: function()
>       {
>               this.base(arguments);
>               this.setCaption(this.getWinTitle());
>               var layout = new qx.ui.layout.Grow();
>               this.setLayout(layout);
>               this.addListener("close", this.onClose, this);
>               
>               this.setTableModel(new qx.ui.table.model.Simple());
>               var tmd = [ [ "please log in" ] ];
>               this.getTableModel().setColumns( this.getColumnHeaders() );
>               this.getTableModel().setData(tmd);
>               
>               this.setTable(new qx.ui.table.Table(this.getTableModel(), 
> null));
> 
>               this.add(this.getTable());
>               this.timer = qx.util.TimerManager.getInstance();
>               this.timerId = null;
>       },
>       destruct: function() 
>       {
>               if ( this.timerId )
>                       this.timer.stop(this.timerId);
>       },
>       members: {
>               start: function() 
>               {
>                       if ( !this.getDbSessionId() )
>                               return;
>                       var url = this.getPullUrl() + "?edc_session_uuid=" + 
> this.getDbSessionId() ;
>                       this.data = new qx.data.store.Json();
>                       this.data.bind("model", this, "data");
>                       this.data.setUrl(url);
>                       if ( this.getRefreshDelay() > 0 )
>                               this.timerId = this.timer.start(this.refresh, 
> this.getRefreshDelay() * 1000, this, null, 100);
>               },
>               refresh: function()
>               {
>                       this.data.reload();
>               },
>               applyData: function(value, old)
>               {
>                       if ( value )
>                       {
>                               var arr = value.toArray();
>                               var ColHead = null;
>                               // check if the middleware returned a header row
>                               // if so we'll just create a new table later 
> on...
>                               if (arr[0].toArray()[0] == '__header__')
>                               {
>                                       var table = this.getTable();
>                                       this.remove(table);
>                                       var model = this.getTableModel();
>                                       this.setTableModel(new 
> qx.ui.table.model.Simple());
>                                       var tmp = arr[0].toArray();
>                                       tmp.shift();
>                                       ColHead = tmp;
>                                       arr.shift();
> 
>                                       this._disposeObjects("model");
>                                       this._disposeObjects("table");
>                                       delete model;
>                                       delete table;
>                               }
> 
>                               var arr2 = [ ];
>                               console.log("copying array");
>                               for ( var i = 0; i < arr.length; i++ )
>                               {
>                                       var row = arr[i].toArray();
>                                       arr2[i] = row;
>                               }
> 
>                               var oldData = this.getTableModel().getData();
> 
>                               if ( ColHead )
>                               {
>                                       this.setColumnHeaders(tmp);
>                               }
>                               this.getTableModel().setData(arr2);
>                               if ( ColHead )
>                               {
>                                       this.setTable(new 
> qx.ui.table.Table(this.getTableModel(), null));
>                                       this.add(this.getTable());
>                               }
> 
>                               this._disposeArray("oldData");
>                               delete oldData;
>                               this._disposeArray("value");
>                               delete value;
>                               value = null;
>                               this.fireDataEvent("dataRefreshed", this);
>                       }
>                       if ( old )
>                       {
>                               this._disposeArray("old");
>                               delete old;
>                               old = null;
>                       }
>               },
>               onClose: function()
>               {
>                       console.log("DataTable window closed");
>                       if ( this.timerId )
>                               this.timer.stop(this.timerId);
>               },
>               setColHeads: function(value, old)
>               {
>                       if (value)
>                       {
>                               console.log("setColumns called");
>                               var tmd = this.getTableModel();
>                               if ( tmd )
>                               {
>                                       console.log("setColumns called with 
> model");
>                                       //var idx = [];
>                                       //for ( var i = 0; i < value.length; 
> i++ )
>                                       //      idx.push(i);
>                               //      tmd.setColumns(value, idx);
>                                       tmd.setColumns(value);
> 
>                                       //for ( i = 0; i < value.length; i++ )
>                                       //      
> this.getTable().getTableColumnModel().setColumnVisible(i, true);
>                               }
>                       }
>               }
> 
>       },
>       events: {
>               "dataRefreshed": "qx.event.type.Data"
>       }
> });
> ------------------------------------------------------------------------------
> Everyone hates slow websites. So do we.
> Make your web apps faster with AppDynamics
> Download AppDynamics Lite for free today:
> http://p.sf.net/sfu/appdyn_d2d_mar
> _______________________________________________
> qooxdoo-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/qooxdoo-devel


------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_mar
_______________________________________________
qooxdoo-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/qooxdoo-devel

Reply via email to