2013-02-24 1 views
0

플렉스 어레이 콜렉션이 많은 양의 데이터 (예 : 2,00,000 개의 새로운 참조 된 오브젝트)로 처리 될 때 플렉스 클라이언트 브라우저의 메모리가 20MB를 소비합니다. 이 초과 20MB는 객체에 정의 된 변수와 독립적입니다. 자세한 예가 아래에 나와 있습니다.큰 데이터를 사용하는 플렉스 플렉스 클라이언트

var list:ArrayCollection = new ArrayCollection; 
for(var i:int = 0;i<200000;i++) 
{ 
    var obj:Object = new Object; 
    list.add(obj); 

} 

위의 코드를 실행하면 플렉스 클라이언트 브라우저 메모리가 20MB 증가합니다. 다른 시나리오의 경우 배열 객체 컬렉션에 액션 스크립트 객체를 추가하려고 시도했습니다. 액션 스크립트 객체는 아래에 정의되어 있습니다.

public class Sample 
{ 
    public var id:int; 
    public var age:int; 
    public Sample() 
    { 
    } 

} 

200000 개의 샘플 클래스를 배열 컬렉션에 추가 할 때 여전히 20MB의 메모리 누출이있었습니다.

var list:ArrayCollection = new ArrayCollection; 
for(var i:int = 0;i<200000;i++) 
{ 
    var obj:Sample = new Sample; 
    obj.id= i; 
    onj.age = 20; 
    list.add(obj); 

} 

플렉스 arrayList와 배열에 샘플 객체를 추가하려고했지만 문제가 여전히 지속됩니다. 플렉스가이 초과 메모리를 어디에 사용하는지 설명 할 수 있습니까?

+2

왜 '누출'이라고 부릅니까? – ethrbunny

답변

1

OS에 메모리를 요청하는 데 많은 시간이 소요되므로 Flash Player는 이러한 요청의 수를 최소화하기 위해 많은 양의 메모리를 요청합니다.

0

OS 할당 시간이 더 이상 중요하지 않다는 것을 나는 잘 모른다. 우리는 평균 1.5-2GHz Cpu (심지어 모바일)이다. 그러나 Benoit은 바른 길을 걷고 있습니다. 큰 덩어리는 주로 힙 조각화를 피하기 위해 한 번에 예약되어 있습니다. 한 번에 필요한 크기의 청크로 메모리가 요청 된 경우 다른 IO 요청과 함께 시스템 메모리가 매우 빠르게 조각 나게됩니다. 이러한 조각이 OS 공간으로 반환 될 때 - 메모리 관리자가 같은 크기 이하의 요청을 얻지 못하면이 청크를 재 할당 할 수 없으므로 보이는 풀에 손실됩니다. 따라서이 문제를 피하기 위해 Flash (및 메모리 관리자)는 한 번에 16MB를 요청합니다.

귀하의 경우 1 개의 개체 또는 100,000을 생성했는지는 중요하지 않습니다. 여전히 최소 16MB의 개인용 메모리 (일명 작업 관리자에서 볼 수있는 것)로 시작합니다.

플래시 플레이어 할당 메커니즘은 Mozilla MMgc를 기반으로합니다.
여기에서 읽을 수 있습니다 : https://developer.mozilla.org/en-US/docs/MMgc