0

我刚刚尝试修复项目中的一些内存泄漏,并发现了一个有趣的问题。似乎我的绝大多数“点”对象都没有被垃圾收集器拾取。每一帧它都会创建大约 5000 个新的 Point 对象,其中似乎只有不到 10% 的对象被拾取。即使您使用这样的代码:

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

即使我重复它超过 500 次,似乎也只有一小部分被抹去。这真的让我现在很紧张,我想知道是否有人以前遇到过这个问题,知道如何解决它/绕过它,或者关心我到底做错了什么。

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

附言。我正在使用 The Miner 检查资源使用情况

编辑:现在已经快速检查了我在哪里运行了大约一个小时的程序,虽然内存使用量增加了大约 140MB,但它确实在此时开始垃圾收集并且没有超过那个。所以他们会被捡起来,但直到你创造了几百万;)

4

2 回答 2

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

只是一个想法 :)

于 2012-07-20T13:47:04.913 回答
0

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

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

[...]

重要的是要记住,您无法控制何时释放对象,因此当您使用完对象后,必须尽可能使它们保持惰性。

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

避免这种行为的最佳方法是将创建的对象化并重用它们,而不是创建一个新对象。

于 2012-07-20T16:12:47.047 回答