[Memory Leak – Flash Player]- P3. Các kịch bản xảy ra Memory Leak

[Bạn có thể đọc phần 1 tại đây]

[Bạn có thể đọc phần 2 tại đây]

Ghi chú: Đây là phần cuối cùng trong loạt bài về Memory Leak

Flash Player cấp phát bộ nhớ như thế nào ?

Do hoạt động bên trong môi trường “host” của Browser, việc cấp phát cũng như tốc độ cấp phát bộ nhớ của Flash Player phụ thuộc rất nhiều vào browser. Do đó để tăng tốc độ thực thi, Flash Player không xin Browser cấp phát từng khối nhớ nhỏ qua nhiều request mà thay vào đó nó xin cấp phát mỗi lần một khối nhớ có kích thước lớn, như vậy sẽ không request nhiều lần.

Phân loại Memory Leak

ML gây ra bởi các tham chiếu

Do cơ chế GC sẽ quyết định Object nào sẽ được giải phóng thông qua các tham chiếu của nó, lập trình viên nên lưu ý đến các tham chiếu do mình tạo ra khi tham chiếu đến một object để tránh hiện tượng ML. Đoạn mã sau minh họa kịch bản xảy ra ML do tham chiếu

1. private var firstReference:Object = {foo: 'bar'};
2. private var secondReference:Object = firstReference;
3. firstReference = null;

Trong kịch bản trên, firstReference sẽ vẫn tồn tại cho dù dòng lệnh 3 thực hiện lệnh gán null, nguyên nhân là do secondReference vẫn còn tồn tại. Cả firstReference và secondReference chỉ bị remove khi parent của 2 reference này bị GC “giải quyết”

ML gây ra bởi các EventListener

Một trong những nguyên nhân phổ biến gây ra ML trong các ứng dụng Flash là do Lập trình viên tùy tiện sử dụng EventListener. EventListener đưa tất cả các tham chiếu của đối tượng “callback” vào một mảng chứa trong các “target object”, và GC sẽ dựa vào các tham chiếu này để thực hiện việc giải phóng bộ nhớ. Tuy nhiên trong một số trường hợp sau thì GC sẽ không bị chận:
– Trường hợp tồn tại các tham chiếu “yếu” – weak refererenes
– Trường hợp tồn tại các tham chiếu trên chính bản thân đối tượng – self references
– Trường hợp tồn tại các tham chiếu đến các object con – references to Child Objects

Trường hợp Weak References xảy ra khi tham số thứ 5 (useWeakReference) trong  lời gọi hàm addEventListener được thiết lập true. Theo mặc định, AS3 đặt giá trị này là false để có các tham chiếu mạnh (strong references). Tuy nhiên việc đặt tham chiếu “yếu” sẽ làm cho đối tượng không có các tham chiếu nào khác và dễ dàng bị GC giải phóng, từ đó dẫn đến các lỗi khó hiểu.
Trường hợp Self Reference nghĩa là một object tham chiếu chính nó hay thêm một EventListener vào chính nó. Khi đối tượng bị giải phóng thì các tham chiếu của chính bản thân nó sẽ bị giải phóng – ví dụ:

this.addEventListener(MouseClick.CLICK, handlerFunction);

Trong trường hợp còn lại, khi object cha bị “GC” thì các tham chiếu đến đối tượng con cũng được giải phóng, dọn đường cho đối tượng con bị “GC”. Tất nhiên đây là cách an toàn để tránh ML và cũng loại bỏ các mối lo về ML. Lập trình viên cũng nên lưu ý 1 điều quan trọng là với Flash Player thì khi đối tượng cha được giải phóng thì CHƯA CHẮC đối tượng con được giải phóng.

Tham khảo từ
http://dreamingwell.com/articles/archives/2008/05/understanding-m.php
http://www.adobe.com/devnet/flashplayer/articles/garbage_collection.html

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s