我正在使用famo.us创作桌面Web应用程序。应用程序的本质是根据用户输入和服务器响应运行一些动画。
运行应用程序一段时间后检查堆,它显示,创建的每个famo.us对象(表面,视图)仍然在内存中。我确保在我的应用程序中没有对这些对象的任何引用,但是没有用。
以下是一个示例代码,它创建了4个表面对象(没有进一步的动作或动画)。由于我的应用程序没有引用任何Surface对象,我希望这些对象被释放,但是,你可以看到堆中存在4个Surface对象(chrome profiling)。
define(function(require, exports, module) {
var Engine = require("famous/core/Engine");
var Surface = require("famous/core/Surface");
var RenderController = require('famous/views/RenderController');
var mainContext = Engine.createContext();
function addSurface(){
var surface = new Surface({
size: [200, 200],
content: "Hello World",
classes: ["red-bg"],
properties: {
lineHeight: "200px",
textAlign: "center"
}
});
mainContext.add(surface);
}
addSurface();
addSurface();
addSurface();
var surface = new Surface({
size: [200, 200],
content: "Hello World",
classes: ["red-bg"],
properties: {
lineHeight: "200px",
textAlign: "center"
}
});
var rc = new RenderController();
mainContext.add(rc);
rc.show(surface);
rc.hide();
surface = null;
mainContext = null;
rc = null;
Engine = null;
Surface = null;
RenderController = null;
});
请帮我弄清楚我错过了什么。
答案 0 :(得分:0)
我不了解您的具体用例和您使用的技术,但根据我对GC工作原理的一般了解,以下是一些可能有助于您缩小问题范围的原因:
参考逃脱
即使您似乎释放了对要收集的对象的所有引用,同时调用的方法也可能将对这些对象的引用传递给全局可达的数据结构(例如静态变量),这会导致对象保持静止可以从GC根源到达。
对象有资格收集,但不会收集
可能无法再从GC根目录访问这些对象,但仍可在分析器中看到这些对象,因为没有垃圾收集(它们所在的堆空间)已运行。这可能有多种原因,最简单的是你有一个标记收集器,堆空间还没用完。如果您可以选择鼓励程序中的垃圾收集,您可以试试。
参考周期
如果对象在一个循环中相互引用,则基本引用计数GC无法确定这些对象是垃圾并且可以被释放。