Ember 1.3+可能的内存泄漏

时间:2014-03-26 16:51:49

标签: javascript ember.js memory-leaks

过去4个月我们在EmberJS中构建了一个应用程序。由于我们客户的要求,我们选择不使用Ember Data,因为他们不希望处于alpha状态的依赖关系,因此我们将自己的数据层放在一起相对简单。我们定义了定义路由和dataAdapter的服务类,它们可以调用多个服务并以可用的格式显示数据。我们已经开始注意到,内存消耗不断增加,直到应用程序变得过载而无法在合理的时间内响应。

我已经运行了Chrome时间线记录器,当我们加载数据时,我们看到一些XHR加载会导致大的净内存增加,当数据为10K或更少时会导致1到10 MB的跳转。我还在另一个使用相同服务/ dataAdapter体系结构构建的网站上运行记录器(减去ember deferreds / promises),我没有看到任何这样的峰值,内存显示出预期的水平。

这是我们的代码:

App = Ember.Application.create();

App.Router.map(function() {
  // put your routes here
});

App.IndexRoute = Ember.Route.extend({
  model: function() {
    var dataAdapter = new App.StatusDataAdapter();

    return dataAdapter.load()
        .then(function(results) {
            return results.statuses;
        });
  }
});

(function($) {
    $.mockjax({
        url: '/config/status_lists/task_status',
        type: 'GET',
        responseText: ['red', 'orange', 'yellow', 'green', 'blue', 'indigo', 'violet']
    });
})(jQuery);

App.StatusService = (function () {  
    function init() {
        return {
            load: function() {
                "use strict";

                var url = '/config/status_lists/task_status',
                    self = this,
                    hash = {
                            url: url,
                            type: 'GET',
                            context: this,
                            dataType: 'json'
                        };

                return new Ember.RSVP.Promise(function(resolve, reject) {
                    hash.success = function(json) {
                        Ember.run(null, resolve, json);
                    };

                    hash.error = function(jqXHR) {
                        Ember.run(null, reject, adapter.ajaxError(jqXHR));
                    };

                    return Ember.$.ajax(hash);
                });
            }
        };
    }

    return init;
})();

App.StatusDataAdapter = (function () {  
    function init() {
        return {
            load: function() {
                "use strict";

                var service = new App.StatusService(),

                promises = {
                    statuses: service.load(),
                    status2: service.load(),
                    status3: service.load(),
                    status4: service.load(),
                    status5: service.load()
                };

                return Ember.RSVP.hash(promises)
                    .then(function (results){
                        console.log('statuses loaded');
                        return results;
                    });
            }
        }
    }

    return init;
})();

我在http://jsfiddle.net/jessesanders/95fP5/组建了一个JSFiddle,它非常模仿我们正在做的事情。每次单击运行时,我都看到内存跳起,直到它达到大约100 MB,然后它停止增加。这让我很担心,因为这是一个数据负载较小的超级简单示例。我们正在使用更大的数据负载进行更多负载,并观察浏览器停止运行。

有关如何解决此问题的任何想法?我们是否需要明确释放资源或做出错误导致这种情况?我没有选择使用Ember Data,因此我必须使这些数据正常工作并且运行良好。感谢所有帮助和想法。

提前致谢!

0 个答案:

没有答案