我刚刚尝试修复项目中的一些内存泄漏并发现了一个有趣的问题。好像我的'Point'对象的绝大部分都没有被垃圾收集器拾取。它创建的每个框架大约有5000个新的Point对象,其中不到10%的对象似乎被拾取。即使你使用这样的代码:
var tempPoint :Point = new Point();
tempPoint = null;
即使我重复500次,也只有一小部分被删除。这真的说明了我现在的紧张情绪,我想知道是否有人之前遇到过这种情况,知道如何解决它/绕过它,或者关心我究竟做错了什么。
很想知道任何人对此的看法
PS。我正在使用The Miner来检查资源使用情况
编辑:现在已经快速检查了我的程序运行了大约一个小时,尽管内存使用量增加了大约140MB,但它确实在此时开始进行垃圾收集并且没有超过它。因此,他们将被接收,但直到你创造了数百万;)
答案 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 创建的对象并重用它们而不是创建新对象。