Actionscript 3 垃圾回收未拾取Actionscript 3.0点对象

Actionscript 3 垃圾回收未拾取Actionscript 3.0点对象,actionscript-3,memory-leaks,garbage-collection,point,Actionscript 3,Memory Leaks,Garbage Collection,Point,我刚刚尝试修复项目中的一些内存泄漏,并发现了一个有趣的问题。看起来我的“点”对象的绝大多数都没有被垃圾收集器拾取。每一帧它都会创建大约5000个新的点对象,其中只有不到10%的对象被拾取。即使使用这样的代码: var tempPoint :Point = new Point(); tempPoint = null; 即使我重复了500多次,似乎只有一小部分被删除了。这真的让我很紧张,我想知道是否有人以前遇到过这种情况,知道如何解决它/绕过它,或者关心告诉我我到底做错了什么 我很想知道任何人对此

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

var tempPoint :Point = new Point();
tempPoint = null;
即使我重复了500多次,似乎只有一小部分被删除了。这真的让我很紧张,我想知道是否有人以前遇到过这种情况,知道如何解决它/绕过它,或者关心告诉我我到底做错了什么

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

另外,我正在使用矿工检查资源使用情况


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

你要等多久才能删除它们

如果每帧创建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);
   }
}
类点池{
私有变量点:向量。;
公共函数PointPool(){
_点=新向量。();
}
公共函数createPoint(x:Number,y:Number):点{
var p:Point=null;
如果(_points.length>0)
p=_points.pop();
其他的
p=新点();
p、 x=x;
p、 y=y;
返回p;
}
公共函数返回点(点:点):无效{
_点。推(点);
}
}
只是想一想:)

我将引用来回答你的问题:

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

[……]

记住,您无法控制对象何时被释放,这一点非常重要,因此您必须在处理完对象后尽可能使它们保持惰性

那么,你的代码怎么了?FP创建了大约5000个
点的实例。如果您查看一段时间内的内存使用情况,您可能会注意到几秒钟后它将降至初始值


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

感谢Jonatan的反馈,我想你可能会有这样的想法,我可能有点不耐烦,我将在较长的时间内运行一个测试(我在mo上只等待了大约3分钟)然后看看他们是否被收集起来。我只是不喜欢看到内存使用率上升!我认为对象池的情况并不是我的解决方案,我看到这个问题发生在Starling DisplayObject.GlobalTopolocal函数中,因此该点只需要短暂的时间,并且应该在下一个相关事件时重新计算,无需存储它。谢谢你的回答,弗洛伦特,我刚刚回到工作中,现在将测试这个,但正如我早些时候对乔纳坦说的,我认为你的回答可能是正确的,我只是有点不耐烦。不幸的是,Starling方法DisplayObject.globalToLocal使用Matrix.transformPoint,它总是创建一个新对象,因此如果我想避免这种情况,我希望我必须创建自己的矩阵变换函数,而不是创建一个新对象。因为这实际上是代码中唯一的内存泄漏,所以当我没有其他功能添加时,我将稍后再讨论它。为帮助干杯:)您应该阅读以下内容: