[Memory Leak – Flash Player]- P2. Garbage Collection

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

Garbage Collection là gì ?

Garbage Collection (GC) là một quá trình chạy ngầm để giải phóng vùng nhớ được cấp phát cho các đối tượng mà ứng dụng không còn sử dụng các đối tượng này nữa.

Để hình dung ra GC hoạt động như thế nào, bạn có thể xem ví dụ nhỏ dưới đây:

1. var a:Object = {foo:"bar"} // tạo object foo có giá trị là bar, sau đó đặt 1 tham chiếu a:
2. var b:Object = a; // sao chép tham chiếu sang b
3. delete(a); // xóa tham chiếu a
4. trace(b.foo); // khi thực hiện trace, kết quả là "bar" -> kết luận là object foo vẫn tồn tại

Như vậy vẫn còn 1 tham chiếu đến object foo, và để GC được thực hiện, ta phải đảm bảo không còn tham chiếu nào đến foo nữa

5. delete(b);

Sau khi thực hiện dòng lênh 5, foo sẽ không còn tham chiếu nào lên lúc này GC sẽ giải phóng foo. Ví dụ trên cũng là một trong những phương pháp để kích hoạt GC, từ đó tránh được hiện tượng Memory Leak.

Các phương pháp để kích hoạt GC

Đếm Tham Chiếu (Reference Counting)

Phương pháp được thực hện ở ví dụ trên được gọi là phương pháp Đếm Tham Chiếu (Reference Counting). Đây là một phương pháp đơn giản và không chiếm tài nguyên CPU, tuy nhiên phương pháp này không thể áp dụng cho các tham chiếu vòng (Circular Reference)  như ví dụ dưới đây

1. var a:Object = {}
2. var b:Object = {foo:a}; // tạo một tham chiếu b thứ hai  - trỏ đến tham chiếu thứ nhất a
3. a.foo = b; // cho tham chiếu a trỏ vào b
4.
5. delete(a); // xóa tham chiếu a
6. delete(b); // xóa tham chiếu b

Trong trường hợp trên, dù cả a và b đều đã bị xóa và chẳng còn cách nào truy cập được 2 objects trên, nhưng số lượng tham chiếu vẫn là 1 vì chúng tham chiếu qua lại lẫn nhau. Trường hợp này sẽ phức tạp hơn nếu bạn có 1 danh sách vòng ( ví dụ: a->b, b->c, c->a …).

Quét đánh dấu (Mark Sweeping)

Đây là cách mà ActionScript 3.0 thực hiện GC bằng cách tìm và đánh dấu các object không còn tham chiếu nào nữa. Flash Player sẽ bắt đầu quét từ object root của ứng dụng, qua mỗi tham chiếu , nó đánh dấu tất cả các object mà nó tìm được. Tiếp theo, Flash Player lặp qua từng đối tượng đánh dấu, tiếp tụcquá trình đệ quy này cho đến khi duyệt hết toàn bộ các đối tượng trong ứng dụng, đánh dấu tất cả mọi thứ nó có thể tiếp cận thông qua các tham chiếu đang hoạt động.  Vào giai đoạn cuối của quá trình quét và đánh dấu này, Flash Player có thể giả định tất cả các object trong bộ nhớ không được đánh dấu không còn có bất kỳ tham chiếu nào thì có thể remove một các an toàn.

Phương pháp này tỏ ra chính xác, nhưng cách thức hoạt động bằng cách dùng đệ quy để duyệt qua các object sẽ làm tốn tài nguyên và “vắt kiệt” CPU. Flash Player 9 tối ưu quá trình này bằng cách thực hiện ở một số frame nhất định thay vì chạy cùng một lúc trên tất cả các frame.

One thought on “[Memory Leak – Flash Player]- P2. Garbage Collection

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