문제

나는 지속적으로 객체를 생성하고 파괴하는 꽤 큰 Flex & Papervision3D 응용 프로그램을 가지고 있습니다.또한 SWF 리소스 파일도 로드 및 언로드합니다.SWF가 실행되는 동안 플레이어가 삐걱거릴 때 약 2GB까지 메모리를 천천히 소모합니다.분명히 나는 ​​GC가 그 일을 할 것이라는 기대로 더 이상 원하지 않는 인스턴스에 대한 참조를 놔두었다고 확신합니다.하지만 문제가 어디에 있는지 알아내는 데 많은 시간을 보내고 있습니다.

메모리 스냅샷 캡처 등을 위해 프로파일러와 해당 옵션을 사용해 보았지만 내 문제는 여전히 회피적입니다.디버그 플래시 플레이어 사용에도 알려진 문제가 있는 것 같은데요?하지만 릴리스 버전을 사용하는 것도 즐겁지 않습니다.

FLEX/AS3를 사용하여 메모리 누수 문제를 어떻게 추적합니까?소비를 찾는 데 사용한 전략, 요령, 도구는 무엇입니까?

도움이 되었습니까?

해결책

Flex Builder에서 Flex Profiler를 사용하는 방법을 설명하는 내용을 우연히 발견했는데, 메모리 누수를 디버깅하는 데 큰 도움이 되었습니다.나는 그것을 시험해 보는 것이 좋습니다.사용하기가 매우 쉽습니다.내 애플리케이션을 프로파일링할 때 발견한 몇 가지 사항은 다음과 같습니다.

컬렉션(적어도 큰 컬렉션)을 값 개체의 속성으로 사용하지 마세요.내 Cairngorm 애플리케이션에는 여러 유형의 값 개체 클래스가 있었고 각각에는 "자식" 속성이 있었습니다. ArrayCollection, 필터링에 사용되었습니다.프로파일링할 때 이것이 가장 큰 메모리 소모자 중 하나라는 것을 알았으므로 대신 "parentId"를 int 이를 필터링에 사용합니다.사용된 메모리가 대폭 줄었습니다.이 같은:

기존 방식:

public class Owner1
{
    public var id:int;
    public var label:String;
    public var children:ArrayCollection; // Stores any number of Owner2 Objects
}

public class Owner2
{
    public var id:int;
    public var label:String;
    public var children:ArrayCollection; // Stores any number of Owner3 Objects
}

public class Owner3
{
    public var id:int;
    public var label:String;
}

새로운 길:

public class Owner1
{
    public var id:int;
    public var label:String;
}

public class Owner2
{
    public var id:int;
    public var label:String;
    public var parentId:int; // Refers to id of Owner1 Object
}

public class Owner3
{
    public var id:int;
    public var label:String;
    public var parentId:int; // Refers to id of Owner2 Object
}

또한 더 이상 필요하지 않은 이벤트 리스너를 제거하는 것이 좋습니다.

다른 팁

나는 보통 내가 만드는 모든 클래스에 정리 메서드를 구현합니다(AS에는 소멸자가 없기 때문입니다).제가 GC에서 발견한 주요 문제는 이벤트 리스너에 관한 것입니다.더 심각하게 말한 것 외에도 익명의 수신기 기능을 피하십시오(명시적으로 제거할 수는 없으므로).다음은 유용할 수 있는 몇 가지 링크입니다.

이와 같은 문제 때문에 저는 언제든지 실행 중인 모든 이벤트를 모니터링하는 데 도움이 되는 오픈 소스 라이브러리를 개발했습니다.구현하기가 정말 쉽고 10~15분 만에 프로젝트를 리팩토링하여 내가 개발한 EventController를 사용하도록 변환했습니다.

기본적으로 귀하의 시나리오에서는 모든 이벤트를 실행하고 다음에서 교체합니다.obj.addEventListener(...);

에게 :EC.add(obj,...);

나머지는 이벤트를 등록하고 EC.log()를 사용하여 원하는 지점에서 모든 이벤트를 쉽게 볼 수 있도록 하는 것과 같습니다.

모든 세부 사항과 문서는 내 사이트에 있습니다. 이것이 도움이 되는지, 그리고 작업을 시작하는지 알고 싶습니다.좋은 피드백이나 나쁜 피드백이 있으면 언제든지 게시해 주세요. 제가 조사하겠습니다!

사이트는 다음과 같습니다http://fla.as/ec/

메모리 누수가 기하급수적으로 증가한다면 이는 아마도 GC가 해당 작업을 수행하지 못하고 있음을 의미할 것입니다.코드를 살펴보고 객체의 참조 카운트를 줄일 수 있는 곳이 어디인지 알아보세요. null).이벤트 핸들러를 약하게 만듭니다.그리고 프로필을 다시 작성하세요.

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