Actionscript 3을 사용하여 ByteArray 언로드


91

ByteArrayActionScript 3을 사용하여 메모리에서 강제로를 언로드하려면 어떻게해야 합니까?

나는 다음을 시도했다 :

// First non-working solution
byteArray.length = 0;
byteArray = new ByteArray();

// Second non-working solution
for ( var i:int=0; i < byteArray.length; i++ ) {
    byteArray[i] = null;
}

답변:


35

나는 당신이 걱정할 것이 없다고 생각합니다. 경우 System.totalMemory다운되면 당신은 휴식을 취할 수 있습니다. 새로 해제 된 메모리를 회수하지 않는 OS 일 수 있습니다 (다음 번에 Flash Player가 더 많은 메모리를 요구할 것으로 예상 됨).

메모리를 많이 사용하는 다른 작업을 시도하면 Flash Player에 할당 된 메모리가 줄어들고 대신 다른 프로세스에 사용된다는 것을 알 수 있습니다.

내가 이해했듯이 최신 OS의 메모리 관리는 각 프로세스에 할당 된 양이나 할당 된 총 양을 보는 관점에서 직관적이지 않습니다.

Mac을 5 분 동안 사용하면 3GB RAM의 95 %가 사용되며 그대로 유지되지만 절대 다운되지 않습니다. 이것이 OS가 메모리를 처리하는 방식입니다.

다른 곳에서 필요하지 않은 한 종료 된 프로세스에도 메모리가 할당되어 있습니다 (예를 들어 다음 번에 더 빨리 시작할 수 있음).


25

(긍정적이지는 않지만 ...)

AS3는 비 결정적 가비지 수집을 사용합니다. 즉, 역 참조 된 메모리는 런타임이 그렇게 느껴질 때마다 해제됩니다 (일반적으로 실행하는 데 비용이 많이 드는 작업이므로 실행할 이유가없는 경우). 이것은 대부분의 최신 가비지 수집 언어 (예 : C # 및 Java)에서 사용하는 것과 동일한 접근 방식입니다.

가리키는 메모리 byteArray또는 배열 자체 내의 항목에 대한 다른 참조가 없다고 가정하면 byteArray선언 된 범위를 종료 한 후 어느 시점에서 메모리가 해제됩니다 .

가비지 수집을 강제 할 수 있지만 실제로는 안됩니다. 그렇다면 테스트를 위해서만 수행하십시오. 프로덕션에서이 작업을 수행하면 돕는 것보다 성능이 훨씬 더 저하됩니다.

GC를 강제하려면 다음을 시도하십시오 (예, 두 번).

flash.system.System.gc();
flash.system.System.gc();

여기에서 자세한 내용을 읽을 수 있습니다 .


20

이 기사를보십시오

http://www.gskinner.com/blog/archives/2006/06/as3_resource_ma.html

IANA 액션 스크립트 프로그래머,하지만 내가 느끼는 느낌은 가비지 수집기가 원할 때 실행되지 않을 수 있기 때문입니다.

따라서 http://www.craftymind.com/2008/04/09/kick-starting-the-garbage-collector-in-actionscript-3-with-air/

그래서 나는 그들의 소장 코드를 시험 해보고 그것이 도움이되는지 확인하는 것이 좋습니다

private var gcCount:int;
private function startGCCycle():void{
    gcCount = 0;
    addEventListener(Event.ENTER_FRAME, doGC);
}
private function doGC(evt:Event):void{
    flash.system.System.gc();
    if(++gcCount > 1){
        removeEventListener(Event.ENTER_FRAME, doGC);
        setTimeout(lastGC, 40);
    }
}
private function lastGC():void{
    flash.system.System.gc();
}

16

안타깝게도 플래시 / 액션 스크립트의 메모리 관리에 관해서 는 할 수있는 일이 많지 않습니다. ActionScript는 사용하기 쉽도록 설계되었으므로 사람들이 메모리 관리에 대해 걱정할 필요가 없었습니다.

다음은 해결 방법 ByteArray입니다. 변수 를 만드는 대신 시도해보십시오.

var byteObject:Object = new Object();

byteObject.byteArray = new ByteArray();

...

//Then when you are finished delete the variable from byteObject
delete byteObject.byteArray;

byteArray의 동적 속성은 어디에 byteObject할당 된 메모리를 해제 할 수 있습니다.


16

나는 당신이 당신 자신의 질문에 대답했다고 믿습니다.

System.totalMemory할당되지 않은 "사용"중인 총 메모리 양을 제공합니다. 애플리케이션에서 20MB 만 사용할 수 있지만 향후 할당을 위해 무료로 사용할 수있는 5MB가 있습니다.

Adobe 문서가 메모리를 관리하는 방식을 밝힐 지 확실하지 않습니다.


11

따라서 MySQL에서 20MB를로드하면 작업 관리자에서 응용 프로그램의 RAM이 약 25MB까지 올라갑니다. 그런 다음 연결을 닫고 ByteArray를 폐기하려고하면 RAM이 해제되지 않습니다. 그러나 System.totalMemory를 사용하면 플래시 플레이어에서 메모리가 해제되고 있음을 표시하지만 그렇지 않습니다.

플래시 플레이어가 Java와 같은 작업을 수행하고 힙 공간을 예약하고 앱이 종료 될 때까지 해제하지 않습니까?

AVM2의 GC가 낙관적이며 자체적으로 신비한 방식으로 작동 할 것이라는 수많은 블로그 게시물을 읽었을 수 있습니다. 따라서 Java처럼 작동하며 힙 공간을 예약하려고합니다. 그러나 충분한 시간을두고 상당한 메모리를 소비하는 다른 작업을 시작하면 이전 공간이 해제됩니다. 앱 위에서 실행되는 일부 테스트를 통해 밤새 프로파일 러를 사용하여이를 확인할 수 있습니다.


10

따라서 MySQL에서 20MB를로드하면 작업 관리자에서 응용 프로그램의 RAM이 약 25MB까지 올라갑니다. 그런 다음 연결을 닫고 ByteArray를 폐기하려고하면 RAM이 해제되지 않습니다. 그러나 System.totalMemory를 사용하면 플래시 플레이어에서 메모리가 해제되고 있음을 표시하지만 그렇지 않습니다.

플레이어는 메모리를 "해제"합니다. 창을 최소화하고 복원하면 밈이 System.totalMemory가 표시하는 것과 훨씬 더 가깝다는 것을 알 수 있습니다.

실제로 메모리 누수가 있는지 보여줄 수있는 FlexBuilder의 프로파일 링 도구를 사용하는 데 관심이있을 수 있습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.