垃圾收集未捕获Actionscript 3.0 Point Object

时间:2012-07-20 13:11:10

标签: actionscript-3 memory-leaks garbage-collection point

我刚刚尝试修复项目中的一些内存泄漏并发现了一个有趣的问题。好像我的'Point'对象的绝大部分都没有被垃圾收集器拾取。它创建的每个框架大约有5000个新的Point对象,其中不到10%的对象似乎被拾取。即使你使用这样的代码:

var tempPoint :Point = new Point();
tempPoint = null;

即使我重复500次,也只有一小部分被删除。这真的说明了我现在的紧张情绪,我想知道是否有人之前遇到过这种情况,知道如何解决它/绕过它,或者关心我究竟做错了什么。

很想知道任何人对此的看法

PS。我正在使用The Miner来检查资源使用情况

编辑:现在已经快速检查了我的程序运行了大约一个小时,尽管内存使用量增加了大约140MB,但它确实在此时开始进行垃圾收集并且没有超过它。因此,他们将被接收,但直到你创造了数百万;)

2 个答案:

答案 0 :(得分:1)

你等了多久才被删除?

如果你每帧创建5000个新对象,那么使用对象池可能是个好主意。

class PointPool {
    private var _points:Vector.<Point>;

    public function PointPool() {
        _points = new Vector.<Point>();
    }

    public function createPoint(x:Number, y:Number):Point {
        var p:Point = null;

        if( _points.length > 0 ) 
            p = _points.pop();
        else
            p = new Point();

        p.x = x;
        p.y = y;

        return p;
   }

   public function returnPoint(point:Point):void {
        _points.push(point);
   }
}

只是一个想法:)

答案 1 :(得分:0)

我会引用 Grant Skinner 来回答您的问题:

  

非常重要的事情要理解FP9中的垃圾收集器,它的操作是延迟的。删除所有活动引用后,不会立即删除您的对象,而是将来在某些不确定的时间删除它们(从开发人员的角度来看)。

     

[...]

     

请务必记住,您无法控制何时取消分配对象,因此在完成对象时必须使它们尽可能保持惰性。

那么,你的代码发生了什么? FP在5000 Point个实例附近创建了一些东西。如果您查看一段时间内存的使用情况,您可能会注意到它会在几秒钟后降至初始值。

避免此行为的最佳方法是 pool 创建的对象并重用它们而不是创建新对象。