Javascript famo.us-垃圾收集-问题

Javascript famo.us-垃圾收集-问题,javascript,garbage-collection,famo.us,Javascript,Garbage Collection,Famo.us,我正在使用famo.us编写一个桌面web应用程序。应用程序的本质是根据用户输入和服务器响应运行一些动画 运行应用程序一段时间并检查heap后,它发现,每个famo.us对象表面,创建的视图仍在内存中。我已经确保在我的应用程序中没有对这些对象的引用,但是没有任何用处 下面是一个示例代码,它创建了4个曲面对象,没有进一步的动作或动画。由于我的应用程序不包含对任何曲面对象的引用,我希望这些对象能够被发布,但是,您可以看到,在heap chrome profiling中存在4个曲面对象 define(

我正在使用famo.us编写一个桌面web应用程序。应用程序的本质是根据用户输入和服务器响应运行一些动画

运行应用程序一段时间并检查heap后,它发现,每个famo.us对象表面,创建的视图仍在内存中。我已经确保在我的应用程序中没有对这些对象的引用,但是没有任何用处

下面是一个示例代码,它创建了4个曲面对象,没有进一步的动作或动画。由于我的应用程序不包含对任何曲面对象的引用,我希望这些对象能够被发布,但是,您可以看到,在heap chrome profiling中存在4个曲面对象

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;
});

请帮我找出我遗漏了什么。

我不知道您的具体用例和您正在使用的技术,但根据我对GC工作原理的一般了解,以下是一些可能帮助您缩小问题范围的原因:

参考逃逸 即使您似乎释放了对要收集的对象的所有引用,同时调用的方法可能会将对这些对象的引用传递给全局可访问的数据结构,例如静态变量,这将导致这些对象仍然可以从GC根访问

对象符合收集条件,但不进行收集 这些对象可能不再可以从GC根访问,但在探查器中仍然可见,因为它们所在的堆空间没有运行垃圾收集。这可能有多种原因,最简单的原因是您有一个标记收集器,并且堆空间还没有用完。如果您可以选择鼓励从程序中进行垃圾收集,您可以尝试这样做

参考循环 如果对象在一个循环中相互引用,则基本引用计数GC无法确定这些对象是垃圾,可以释放它们