2008-08-01 29 views

Trả lời

15

Hãy nhìn vào bài viết này

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

Lập trình ActionScript IANA, tuy nhiên cảm giác tôi nhận được là vì bộ thu gom rác có thể không chạy khi bạn muốn nó.

Do đó http://www.craftymind.com/2008/04/09/kick-starting-the-garbage-collector-in-actionscript-3-with-air/

Vì vậy, tôi khuyên bạn nên cố gắng ra mã bộ sưu tập của họ và xem nếu nó giúp

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

(Tôi không tích cực về vấn đề này, nhưng ...)

AS3 sử dụng bộ sưu tập rác không xác định. Điều đó có nghĩa là bộ nhớ không bị nhiễu sẽ được giải phóng bất cứ khi nào thời gian chạy cảm thấy như nó (thường không trừ khi có lý do để chạy, vì nó là một hoạt động tốn kém để thực thi). Đây là phương pháp tương tự được sử dụng bởi hầu hết các ngôn ngữ thu gom rác hiện đại (như C# và Java).

Giả sử không có tham chiếu nào khác đến bộ nhớ được trỏ đến bởi byteArray hoặc các mục trong chính mảng đó, bộ nhớ sẽ được giải phóng tại một số điểm sau khi bạn thoát khỏi phạm vi mà byteArray được khai báo.

Bạn có thể bắt buộc thu thập rác, mặc dù bạn thực sự không nên. Nếu bạn làm thế, hãy làm nó chỉ để thử nghiệm ... nếu bạn làm điều đó trong sản xuất, bạn sẽ làm tổn thương hiệu suất nhiều hơn là giúp nó.

Để buộc một GC, thử (vâng, hai lần):

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

You can read more here.

13

Thật không may khi nói đến quản lý bộ nhớ trong Flash/actionscript không có nhiều thứ bạn có thể làm. ActionScript được thiết kế để dễ sử dụng (vì vậy họ không muốn mọi người phải lo lắng về việc quản lý bộ nhớ)

Sau đây là cách giải quyết thay vì tạo biến số ByteArray.

var byteObject:Object = new Object(); 

byteObject.byteArray = new ByteArray(); 

... 

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

đâu byteArray là một tài sản năng động của byteObject, bạn có thể giải phóng bộ nhớ đã được phân bổ cho nó.

13

Tôi tin rằng bạn đã trả lời câu hỏi của riêng bạn ...

System.totalMemory cung cấp cho bạn tổng dung lượng bộ nhớ là "sử dụng", không được phân bổ. Chính xác là ứng dụng của bạn chỉ có thể sử dụng 20mb, nhưng nó có 5mb miễn phí cho các lần phân bổ trong tương lai.

Tôi không chắc chắn nếu các tài liệu Adobe sẽ làm sáng tỏ cách thức mà nó quản lý bộ nhớ ...

28

Tôi không nghĩ rằng bạn có gì phải lo lắng. Nếu System.totalMemory bị hỏng, bạn có thể thư giãn. Nó có thể rất tốt là hệ điều hành mà không đòi lại bộ nhớ mới được giải phóng (với dự đoán của thời gian tới Flash Player sẽ yêu cầu bộ nhớ nhiều hơn). Hãy thử làm một cái gì đó khác là rất bộ nhớ chuyên sâu và tôi chắc chắn rằng bạn sẽ nhận thấy rằng bộ nhớ được phân bổ cho Flash Player sẽ giảm và được sử dụng cho quá trình khác thay thế.

Như tôi đã hiểu, quản lý bộ nhớ trong hệ điều hành hiện đại không trực quan từ quan điểm xem xét số tiền được phân bổ cho từng quy trình hoặc thậm chí tổng số tiền được phân bổ. Khi tôi đã sử dụng máy Mac của mình trong 5 phút, 95% RAM 3 GB của tôi được sử dụng, và nó sẽ vẫn như vậy, nó sẽ không bao giờ bị hỏng. Đó chỉ là cách hệ điều hành xử lý bộ nhớ. Miễn là nó không cần thiết ở nơi khác, ngay cả các tiến trình đã thoát vẫn có bộ nhớ được gán cho chúng (điều này có thể làm cho chúng khởi chạy nhanh hơn vào lần tới, chẳng hạn).

9

Vì vậy, nếu tôi tải khoảng 20MB từ MySQL, trong Trình quản lý tác vụ, RAM cho ứng dụng tăng khoảng 25MB. Sau đó, khi tôi đóng kết nối và cố gắng vứt bỏ ByteArray, RAM sẽ không bao giờ giải phóng. Tuy nhiên, nếu tôi sử dụng System.totalMemory, trình phát flash sẽ hiển thị rằng bộ nhớ đang được giải phóng, không phải như vậy.

Trình phát flash có hoạt động như Java và đặt không gian vùng nhớ và không phát hành cho đến khi ứng dụng thoát không?

Vâng có và không, như bạn có thể đã đọc từ vô số bài đăng trên blog mà GC trong AVM2 lạc quan và sẽ làm việc theo những cách bí ẩn của riêng nó. Vì vậy, nó hoạt động giống như Java và cố gắng dự trữ không gian heap, tuy nhiên nếu bạn để nó đủ dài và bắt đầu thực hiện các hoạt động khác đang tiêu thụ một số bộ nhớ đáng kể, nó sẽ giải phóng không gian trước đó. Bạn có thể thấy điều này bằng cách sử dụng profiler qua đêm với một số thử nghiệm chạy trên đầu ứng dụng của bạn.

7

Vì vậy, nếu tôi tải nói 20MB từ MySQL, trong Trình quản lý tác vụ, RAM cho ứng dụng tăng khoảng 25MB. Sau đó, khi tôi đóng kết nối và cố gắng vứt bỏ ByteArray, RAM sẽ không bao giờ giải phóng. Tuy nhiên, nếu tôi sử dụng System.totalMemory, trình phát flash sẽ hiển thị rằng bộ nhớ đang được giải phóng, không phải như vậy.

Trình phát đang "giải phóng" bộ nhớ. Nếu bạn thu nhỏ cửa sổ và khôi phục lại cửa sổ, bạn sẽ thấy rằng memeory bây giờ gần gũi hơn với những gì System.totalMemory hiển thị.

Bạn cũng có thể quan tâm đến việc sử dụng các công cụ lược tả của FlexBuilder có thể hiển thị cho bạn nếu bạn thực sự bị rò rỉ bộ nhớ.

Các vấn đề liên quan