Показать сообщение отдельно
Старый 04.08.2012, 00:14
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 5  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Опытным путем установлено, что 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