메모리 해제

객체에 대한 모든 참조를 삭제하여 가비지 수집기가 트리거되도록 합니다.

Flash Player의 릴리스 버전에서 직접 가비지 수집기를 실행할 수 없습니다. 객체가 가비지 수집되도록 하려면 해당 객체에 대한 모든 참조를 삭제합니다. ActionScript 1.0 및 2.0에서 사용되던 이전의 delete 연산자는 ActionScript 3.0에서 다르게 작동합니다. ActionScript 3.0에서는 동적 객체의 동적 속성을 삭제하기 위해서만 사용할 수 있습니다.

참고: Adobe® AIR® 및 Flash Player의 디버그 버전에서 가비지 수집기를 직접 호출할 수 있습니다.

예를 들어 다음 코드는 Sprite 참조를 null 로 설정합니다.

var mySprite:Sprite = new Sprite(); 
 
// Set the reference to null, so that the garbage collector removes  
// it from memory 
mySprite = null;

객체를 null 로 설정해도 메모리에서 객체가 반드시 제거되지는 않습니다. 사용 가능한 메모리가 부족한 것으로 간주되지 않는 경우 가비지 수집기가 실행되지 않기도 합니다. 가비지 수집은 예측 가능하지 않습니다. 가비지 수집은 객체를 삭제할 때가 아니라 메모리를 할당할 때 트리거됩니다. 가비지 수집기가 실행되면 아직 수집되지 않은 객체의 그래프를 찾습니다. 가비지 수집기는 그래프에서 서로 참조하지만 응용 프로그램이 더 이상 사용하지 않는 객체를 찾아 비활성 객체를 검색합니다. 이렇게 검색된 비활성 객체는 삭제됩니다.

대용량 응용 프로그램에서 이러한 프로세스는 CPU를 많이 사용할 수 있으며 성능에 영향을 주고 응용 프로그램의 속도를 크게 저하시킬 수 있습니다. 따라서 가능한 한 많은 객체를 재사용하여 가비지 수집 전달을 제한하는 것이 좋습니다. 또한 가능하면 참조를 null로 설정하여 가비지 수집기에서 객체를 찾는 데 소요되는 처리 시간이 단축되도록 합니다. 가비지 수집은 일종의 보험이라고 생각하고 가능하면 항상 객체 수명을 확실하게 관리해야 합니다.

참고: 표시 객체에 대한 참조를 null로 설정하더라도 해당 객체가 표시 제거되지 않을 수 있습니다. 해당 객체는 가비지 수집될 때까지 계속 CPU 주기를 사용합니다. 객체의 참조를 null 로 설정하기 전에 해당 객체를 올바르게 비활성화했는지 확인하십시오.

가비지 수집기는 Adobe AIR 및 Flash Player의 디버그 버전에서 제공되는 System.gc() 메서드를 사용하여 실행할 수 있습니다. 또한 Adobe® Flash® Builder와 함께 번들로 제공되는 프로파일러를 통해 수동으로 시작할 수도 있습니다. 가비지 수집기를 실행하면 응용 프로그램이 응답하는 방식과 객체가 메모리에서 제대로 삭제되었는지 여부를 확인할 수 있습니다.

참고: 객체가 이벤트 리스너로 사용된 경우 다른 객체가 해당 객체를 참조할 수 있습니다. 이 경우 참조를 null 로 설정하기 전에 removeEventListener() 메서드를 사용하여 이벤트 리스너를 제거합니다.

다행히 비트맵에 사용되는 메모리 양은 즉시 줄일 수 있습니다. 예를 들어 BitmapData 클래스에는 dispose() 메서드가 포함되어 있습니다. 다음 예제에서는 1.8MB의 BitmapData 인스턴스를 만듭니다. 현재 사용 중인 메모리가 1.8MB로 증가하고 System.totalMemory 속성이 더 작은 값을 반환합니다.

trace(System.totalMemory / 1024); 
// output: 43100 
  
// Create a BitmapData instance 
var image:BitmapData = new BitmapData(800, 600); 
 
trace(System.totalMemory / 1024); 
// output: 44964 

다음으로 BitmapData가 메모리에서 수동으로 제거, 즉 삭제되며 메모리 사용이 다시 한 번 검사됩니다.

trace(System.totalMemory / 1024); 
// output: 43100 
  
// Create a BitmapData instance 
var image:BitmapData = new BitmapData(800, 600); 
 
trace(System.totalMemory / 1024); 
// output: 44964 
 
image.dispose(); 
image = null; 
 
trace(System.totalMemory / 1024); 
// output: 43084 

dispose() 메서드가 메모리에서 픽셀을 제거하지만 참조를 계속 null 로 설정해야 메모리가 완전히 해제됩니다. BitmapData 객체가 더 이상 필요하지 않을 때 메모리가 즉시 해제될 수 있도록 항상 dispose() 를 호출하고 참조를 null 로 설정합니다.

참고: Flash Player 10.1 및 AIR 1.5.2에는 System 클래스에 disposeXML() 이라는 새로운 메서드가 도입되었습니다. 이 메서드를 사용하면 XML 트리를 매개 변수로 전달하여 XML 객체를 가비지 수집의 대상으로 즉시 설정할 수 있습니다.