Flash Player의 스팸 메모리 재활용 메커니즘: 강제로 재활용할 수 있습니까?
14175 단어 Flash
스팸 메모리 회수 강제 코드
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에 속한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
writeFlashHTML, 주로 Flash 출력에 사용되는 JS 방법입니다.텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.