1

更新ループで反復子を使用するたびに、メモリ リークの問題が発生します。たとえば、次のとおりです。

class Manager extends FlxState {
  public var array: Array<Int>;
  override public function create():Void {
    array = new Array();
  }

  public override function update() {
    super.update();
    /////////////////////////////////////////////////////
    //
    // ISSUE IS HERE
    // If for(item in array) line is present there's a memory
    // issue.
    //
    /////////////////////////////////////////////////////
    for(item in array) var noop:Int = 0 /* Do nothing */;
  }
}

これを実行すると、永久に続く一定のメモリ増加が得られます。これは、HaxeFlixel のデバッガーでどのように見えるかです:

記憶異常

ただし、次のような単純なループを使用して反復すると:

for(i in (0...array.length)) var noop:Int = 0;

大丈夫だよ:

メモリノーマル

なぜこれが起こっているのですか?

ありがとう。

4

1 に答える 1

1

イテレータがイテレータにメモリを割り当てているために発生していました。

しばらくすると、メモリはガベージ コレクタによって収集されます。

1000個のアレイを使用してストレステストを行いました

class Manager extends FlxState {
  public var arrays: Array<Array<Int>>;
  override public function create():Void {
    arrays = new Array();
    for (i in (0...1000)) arrays.push(new Array());
  }

  public override function update() {
    super.update();
    for (array in arrays)
      for (i in array)
        var noop:Int = 0;
  }
}

そして最終的にメモリが収集されました:

記憶を集めた

于 2015-07-08T08:26:55.180 に答える