Flash Player의 스팸 메모리 재활용 메커니즘: 강제로 재활용할 수 있습니까?

14175 단어 Flash
Adobe Flash Player 10에서 AS3의 내부 스팸 수거 메커니즘은 어떻게 됩니까?프로그래머가 FP에 메모리를 강제로 회수할 수 있습니까?답은 부정적이지만 방법이 있다.
스팸 메모리 회수 강제 코드
AS3 프로그래머는 Flash Player의 스팸 수거를 강제할 수 없습니다.
Moon Spirit은 천지회에서 강제 쓰레기 회수에 관한 글을 쓴 적이 있다. [as hack 기술] 쓰레기 수거기의 강제 집행본고는 LocalConnection을 사용하여 불법 주소를 연결하고 가이드를 포획하여 쓰레기 수거를 강제로 할 수 있음을 예증한다.sban Moonspirit을 토대로 코드를 간단하게 수정했는데 다음과 같다.

 
   

   
     
package {
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.net.LocalConnection;

/* *
*
* @author sban http://sban.biz/
* MoonSpirit
*/
public class GarbageCollectionTest extends Sprite {
private const SQR_AMOUNT :
int = 10000 ; //
private var _container_sp : Sprite; // sprite
private var _sqrList: Array; //

//
private var conn1 :LocalConnection;
private
var conn2 :LocalConnection;

public
function GarbageCollectionTest() {
init( );
}

private
function init( ) : void {
_container_sp
= new Sprite( );
addChild(_container_sp);
// initNoBitmapDataView( );// 4111K, 9K
initBitmapDataView( ); // 14K, 14K,
}

//
private function initNoBitmapDataView( ) : void {
layoutTenThousandSqr( );

unLayoutTenThousandSqr( );
_sqrList
= null ;
removeChild(_container_sp);
_container_sp
= null ;
}

// BitmapData
private function initBitmapDataView( ) : void {
layoutTenThousandSqr( );

unLayoutTenThousandSqr( );
_sqrList
= null ;
removeChild(_container_sp);
_container_sp
= null ;

doClearance( );
}

private
function layoutTenThousandSqr( ) : void {
_sqrList
= new Array( );
for ( var i : int = 0 ; i < SQR_AMOUNT; i ++ ){
_sqrList.push(
new Sprite());
_sqrList[i].graphics.beginFill(
0xff0000 );
_sqrList[i].graphics.drawRect(
0 , 0 , 100 , 100 );
_sqrList[i].graphics.endFill();
_container_sp.addChild(_sqrList[i]);
}
}

//
private function unLayoutTenThousandSqr( ) : void {
for ( var i : int = 0 ; i < SQR_AMOUNT; i ++ ){
_container_sp.removeChild(_sqrList[i]);
delete _sqrList[i];
}
}

//
private function doClearance( ) : void {
trace(
" clear " );
try {
conn1
= new LocalConnection();
conn1.connect(
" sban garbage collection 1 " );
conn2
= new LocalConnection();
conn2.connect(
" sban garbage collection 1 " );
}
catch (e : * ){}
finally {
conn1
= null ;
conn2
= null ;
}
}
}
}
 
우선 sban은doClearance 방법을 사용하지 않고 수동으로 FB의'쓰레기 수거기를 실행합니다'단추를 두 번 눌렀습니다(왜 두 번, 뒤에 대답해야 합니까). 메모리 두 번째는 4111K에서 9K로 떨어졌습니다!아래 그림과 같이 뇌인이라.
그리고 sban은 DoClearance 방법을 호출했습니다. 이번에는 수동으로 회수하든 안 하든 메모리의 점용에 변화가 없습니다. 아래 그림에서 보듯이 DoClearance 방법은 쓰레기 메모리의 회수를 강제시켰습니다. 이 방법이 작용했습니다!
그렇다면 쓸모없는 Local Connection을 두 번 만들어서 메모리를 강제로 회수할 수 있는 이유는 무엇일까요?
3. AS3 스팸 메모리 재활용 메커니즘
Flash Player가 초기화되어 실행될 때 운영 체제에 큰 메모리를 요청하는데, 만약 프로그램이 매우 작다면 이렇게 많은 메모리를 전혀 사용할 수 없을 수도 있지만, FP는 시작할 때 이런 것들을 고려하지 않기 때문에 대부분의 경우 처음 신청한 메모리는 항상 부족하다.처음 요청한 메모리 크기는 운영체제, 브라우저 환경과 관련이 있습니다.
Flash Player가 이미 요청한 메모리가 충분하지 않은 것을 발견하면, 운영체제에 큰 메모리를 요청합니다.그러나 신청하기 전에 FP는 스팸 메모리 회수를 시도할 수 있으니 주의하세요.그럼 어떻게 회수하는 건가요?
Flash Player는 내부에서 게으름식 인용 계수 회수 방안을 사용하여 쓰레기 메모리를 회수한다. 게으름식은 FP가 회수할 수 있는 모든 대상을 한 번에 회수하지 않고 한 번에 일부분만 회수한다. 메모리가 부족하면 운영체제에 신청한다. 만약에 시스템에 메모리가 없으면 다시 회수한다. 만약에 모두 회수해도 부족하면 Game Over!참조 계수는 FP가 내부에 모든 대상에 기호를 표시하고 그 어떠한 대상이 이 대상을 인용하지 않을 때 회수할 수 있음을 가리킨다.만약 용기 안에 서로 관련된 대상이 많다면, 이 용기를 디스플레이 목록에서 제거하고null로 설정하면 회수할 수 있습니다.
소절2에서sban는 왜 수동으로'쓰레기 회수기 운행'버튼을 두 번 눌러야 하는지 물었다. 이것은 FP 쓰레기 회수 메커니즘의 게으름으로 인한 것이다.
FP의 내부 스팸 수거 메커니즘을 알게 된 후에 우리는 왜 두 번의 쓸모없는 Local Connection을 만들고 존재하지 않는 주소를 연결하여 일부러 이상을 던지고 포획하면 스팸 수거를 강제할 수 있는지 대답할 수 있다.AS3에서 LocalConnection은 메모리를 비교적 많이 사용하는 대상이기 때문에 두 번 이런 대상을 만들고 연결을 시도하는 메모리 비용의 크기는 Flash Player가 운영체제에 메모리를 다시 요청할 수 있고 신청하기 전에 FP는 회수를 시도할 수 있기 때문이다.원리는 바로 이렇게 간단하다. 로컬연결을 단독으로 사용하지 않아도 되고, 메모리가 비교적 소모되는 다른 대상도 가능하다.
 
sban 2008년 5월 북경.전재는 작자출처, 비상용임을 명시해 주십시오.본문은 AS3 Expert에 속한다.

좋은 웹페이지 즐겨찾기