Memory Actionscript+;谷歌地图API内存泄漏

Memory Actionscript+;谷歌地图API内存泄漏,memory,actionscript,maps,memory-leaks,Memory,Actionscript,Maps,Memory Leaks,我以前从未使用过actionscript,但为了让地图正常工作,我不得不深入研究它 我正在使用以下代码添加地图标记,如果存在,则替换以前的地图标记: public var tracer:Array = new Array(); public var tracerLng:Number = 0; for ( var i : Number=1 ; i<64000 ; i++) { //Check if there is already a marker, if so get rid o

我以前从未使用过actionscript,但为了让地图正常工作,我不得不深入研究它

我正在使用以下代码添加地图标记,如果存在,则替换以前的地图标记:

public var tracer:Array = new Array();
public var tracerLng:Number = 0;

for ( var i : Number=1 ; i<64000 ; i++)
{
    //Check if there is already a marker, if so get rid of it
    if(tracerLng > 0) {
        map.removeOverlay(tracer[0]);
        tracer[0] = null;
        tracer.pop();
    }
    // Set up a marker
    var trackMrk:Marker = new Marker(
        new LatLng(_lat, _lng),
        new MarkerOptions({
            strokeStyle: new StrokeStyle({color: 0x987654}),
            fillStyle: new FillStyle({color: 0x223344, alpha: 0.8}),
            radius: 12,
            hasShadow: true
        })
    );
    //Add the marker to the array and show it on the map
    tracerLng = tracer.push(trackMrk);
    map.addOverlay(tracer[0]);
}
公共变量跟踪器:数组=新数组(); 公共变量:编号=0; 对于(变量i:Number=1;i 0){ 地图移除覆盖(跟踪器[0]); 跟踪器[0]=null; tracer.pop(); } //设置标记 var trackMrk:Marker=新标记( 新板条(_-lat,_-lng), 新标记选项({ strokeStyle:新的strokeStyle({color:0x987654}), fillStyle:新的fillStyle({color:0x223344,alpha:0.8}), 半径:12, 哈沙多:没错 }) ); //将标记添加到阵列并在地图上显示 tracerLng=tracer.push(trackMrk); map.addOverlay(tracer[0]); } 我的第一个问题是运行这段代码(64000次重复是为了测试,最终的应用程序不需要运行那么多次)。无论哪种方式,内存使用量都会增加约4kB/s—如何避免这种情况发生

第二,有谁能给我建议如何使这个节目更优雅


提前感谢您的建议

这不是内存泄漏,它可能是创建事件的结果-输入帧、鼠标事件、自定义事件等。如果您的内存不会一直不断增加,则无需担心-它将在适当的时候被垃圾收集

代码中的一些要点:

  • tracer
    数组似乎什么都不做——一次只能保存一件东西,因此数组毫无意义。如果需要数组,请使用Vector。它更小更快。如果您创建一个具有特定长度的
  • 除非需要,否则不要创建新的
    标记。重用旧对象。了解对象池:或
  • LatLng
    MarkerOptions
    (包括笔划和填充对象)似乎没有改变(我假设
    LatLng
    对象允许您设置新位置)。如果是这样的话,不要在不需要的时候创建新的。如果需要创建新样式,
    StrokeStyle
    FillStyle
    似乎是“创建一次,到处使用”策略的理想选择
  • Marker
    类中创建
    destroy()
    函数或类似函数,并在需要删除时显式调用它(就在将其设置为
    null
    或从数组中弹出之前)。在
    destroy()
    函数中,将所有参数设置为非基类(int、Number、String等)。垃圾收集使用引用计数方法和标记和清除方法运行。理想情况下,您希望使用引用计数运行所有内容,因为它收集得更快,并且可以停止程序中的任何暂停
我在这里对AS3中的内存管理进行了详细解释:

还包括一个类,帮助您跟踪内存泄漏(如果有)