문제

강제로 언로드하는 방법 ByteArray ActionScript 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;
}

올바른 솔루션이 없습니다

다른 팁

나는 당신이 걱정할 것이 없다고 생각합니다.만약에 System.totalMemory 내려가면 쉴 수 있어요.새로 해제된 메모리를 회수하지 않는 OS일 수도 있습니다(다음 번에 Flash Player가 더 많은 메모리를 요구할 것을 예상하여).

메모리를 많이 사용하는 다른 작업을 수행해 보면 Flash Player에 할당된 메모리가 줄어들고 대신 다른 프로세스에 사용된다는 것을 알게 될 것입니다.

내가 이해한 바와 같이, 최신 OS의 메모리 관리는 각 프로세스에 할당된 양 또는 심지어 할당된 총량을 보는 관점에서 볼 때 직관적이지 않습니다.

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

다른 곳에서 필요하지 않은 한 종료된 프로세스에도 여전히 메모리가 할당되어 있습니다(예를 들어, 이렇게 하면 다음 번에 더 빠르게 시작할 수 있습니다).

(저는 이에 대해 긍정적이진 않습니다만...)

AS3은 비결정적 가비지 수집을 사용합니다.즉, 참조되지 않은 메모리는 런타임이 필요할 때마다 해제됩니다(일반적으로 실행하는 데 비용이 많이 드는 작업이므로 실행할 이유가 없는 한 해제되지 않습니다).이는 C# 및 Java와 같은 대부분의 최신 가비지 수집 언어에서 사용되는 것과 동일한 접근 방식입니다.

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

강제로 가비지 수집을 수행할 수 있지만 실제로는 그렇게 하면 안 됩니다.그렇다면 테스트용으로만 하세요...프로덕션 환경에서 수행하면 성능에 도움이 되기보다 성능이 훨씬 더 저하될 것입니다.

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

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

여기에서 더 많은 내용을 읽을 수 있습니다..

이 기사를 살펴보십시오.

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();
}

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

System.totalMemory 할당되지 않고 "사용되는" 총 메모리 양을 제공합니다.귀하의 애플리케이션이 20MB만 사용하고 있는 것은 정확하지만 향후 할당을 위해 5MB가 무료입니다.

Adobe 문서가 메모리 관리 방식을 밝혀줄지는 잘 모르겠습니다...

불행하게도 메모리 관리에 있어서는 플래시/액션스크립트 당신이 할 수 있는 일은 별로 없습니다.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, 할당된 메모리를 해제할 수 있습니다.

따라서 MySQL에서 20MB를 로드하면 작업 관리자에서 해당 애플리케이션의 RAM이 약 25MB까지 올라갑니다.그런 다음 연결을 닫고 ByteArray를 삭제하려고 하면 RAM이 해제되지 않습니다.그러나 System.totalMemory를 사용하면 Flash Player에서 메모리가 해제되는 중이라고 표시하지만 그렇지 않습니다.

Flash Player가 Java와 같은 작업을 수행하고 힙 공간을 예약하고 앱이 종료될 때까지 이를 해제하지 않습니까?

예, 아니요. 수많은 블로그 게시물에서 읽었을 수도 있지만 AVM2의 GC는 낙관적이며 고유한 신비한 방식으로 작동합니다.따라서 Java와 비슷하게 작동하고 힙 공간을 예약하려고 시도하지만 충분히 오래 두고 상당한 메모리를 소비하는 다른 작업을 시작하면 이전 공간이 해제됩니다.앱 위에서 몇 가지 테스트를 실행하면서 밤새 프로파일러를 사용하여 이를 확인할 수 있습니다.

따라서 MySQL에서 20MB를 로드하면 작업 관리자에서 해당 애플리케이션의 RAM이 약 25MB까지 올라갑니다.그런 다음 연결을 닫고 ByteArray를 삭제하려고 하면 RAM이 해제되지 않습니다.그러나 System.totalMemory를 사용하면 Flash Player에서 메모리가 해제되는 중이라고 표시하지만 그렇지 않습니다.

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

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top