Câu hỏi Dỡ bỏ một ByteArray bằng cách sử dụng Actionscript 3


Làm thế nào để dỡ bỏ một cách mạnh mẽ ByteArray từ bộ nhớ bằng ActionScript 3?

Tôi đã thử những điều sau đây:

// 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;
}

76
2017-08-01 12:30


gốc




Các câu trả lời:


Tôi không nghĩ rằng bạn có bất cứ điều gì phải lo lắng. Nếu System.totalMemory đi xuố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 nó, quản lý bộ nhớ trong hệ điều hành hiện đại là không trực quan từ quan điểm của nhìn vào số tiền phân bổ cho mỗi quá trình, hoặc thậm chí tổng số tiền 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).


31
2017-08-14 17:05





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

AS3 sử dụng một 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 byteArray được khai báo.

Bạn có thể buộc một bộ sưu tậ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 GC, hãy thử (có, hai lần):

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

Bạn có thể đọc thêm ở đây.


22
2017-08-01 13:08





Hãy xem 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ó.

Vì thế 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 thử mã bộ sưu tập của họ và xem nó có giúp ích không

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

17
2017-08-01 13:08





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ớ được "sử dụng", không được cấp phát. 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 liệu các tài liệu Adobe có làm sáng tỏ cách mà nó quản lý bộ nhớ ...


14
2017-08-01 14:03





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à giải pháp thay vì tạo ByteArray biến thử này.

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 cấp phát cho nó.


14
2017-08-01 13:14





Vì vậy, nếu tôi tải nói 20MB từ MySQL, trong Task Manager RAM cho ứng dụng tăng lên 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à không gian lưu trữ 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ố blogposts GC trong AVM2 là lạc quan và sẽ làm việc đó là cách bí ẩn của riêng mình. 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.


9
2017-09-17 10:09





Vì vậy, nếu tôi tải nói 20MB từ MySQL, trong Task Manager RAM cho ứng dụng tăng lên 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.

Người chơi đ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ể cho bạn biết nếu bạn thực sự có rò rỉ bộ nhớ.


8
2017-10-06 18:16