Опытным путем установлено, что System.disposeXML() работает, хотя и несколько парадоксально. Он действительно требует времени на свою работу и чистит не до конца.
Код AS3:
package
{
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.system.*;
import flash.utils.*;
public class Main extends Sprite
{
private var testXML:XML;
private var testBitmapData:BitmapData;
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
checkMemory("before init testXML:");
testXML = generateXML();
checkMemory("after init testXML:");
System.disposeXML(testXML);
System.gc();
checkMemory("after disposeXML(testXML) immediately:");
setTimeout(checkAfterTimeout, 1000);
}
private function checkMemory(label:String) : void
{
trace("Main::checkMemory", label, System.totalMemory/1024);
}
private function checkAfterTimeout() : void
{
checkMemory("after disposeXML(testXML) and timeout:");
}
private function generateXML() : XML
{
var xml:XML = new XML();
for (var i:int = 0; i < 10000; i++)
{
var child:XML = XML('<random/>');
child.@value = Math.random();
xml.appendChild(child)
}
return xml;
}
}
}
Вывод:
Код:
Main::checkMemory before init testXML: 3336
Main::checkMemory after init testXML: 4384
Main::checkMemory after disposeXML(testXML) immediately: 4384
Main::checkMemory after disposeXML(testXML) and timeout: 3620