[Android 01] Sự khác nhau giữa Weak Reference, Soft Reference và Strong Reference
Trong lần phỏng vấn vị trí mới Middle Mobile Developer, một tiền bối chung trường đại học là người phỏng vấn, có một câu hỏi liên quan tới Garbage Collector.
"Sự khác nhau giữa WeakRef, SoftRef, StrongRef trong Android như thế nào?".
Câu trả lời có hàng ngàn recommend trên Google.
Vậy đáp án tổng quan và gần nhất là như thế nào?
Nếu bạn mần mò trên Stack Overflow, bạn hẳn sẽ tìm ra tên của Ethan Nicolas, tác giả của "Understanding Weak References", và lướt xuống mục giải thích cụ thể:
Weak referencesA weak reference, simply put, is a reference that isn't strong enough to force an object to remain in memory. Weak references allow you to leverage the garbage collector's ability to determine reachability for you, so you don't have to do it yourself. You create a weak reference like this:WeakReference weakWidget = new WeakReference(widget);
and then elsewhere in the code you can useweakWidget.get()
to get the actualWidget
object. Of course the weak reference isn't strong enough to prevent garbage collection, so you may find (if there are no strong references to the widget) thatweakWidget.get()
suddenly starts returningnull
.
Nếu bạn có thể dịch được đoạn tiếng Anh trên thì đừng để ý, còn nếu chưa, thì đại ý, WeakRef là references không đủ mạnh để ngăn chặn việc thu hồi 1 object trong vùng nhớ bằng trình thu nhặt rác G.C, viết tắt của Garbage Collector; và nếu bạn muốn lấy object thì sử dụng phương thức get(), hoặc sẽ trả về giá trị khác null trước khi G.C thu hồi, hoặc trả về null nếu nó đã thu hồi.
Vậy SoftReference là gì, khác gì với WeakReference?
Soft referencesA soft reference is exactly like a weak reference, except that it is less eager to throw away the object to which it refers. An object which is only weakly reachable (the strongest references to it areWeakReferences
) will be discarded at the next garbage collection cycle, but an object which is softly reachable will generally stick around for a while.SoftReferences
aren't required to behave any differently thanWeakReferences
, but in practice softly reachable objects are generally retained as long as memory is in plentiful supply. This makes them an excellent foundation for a cache, such as the image cache described above, since you can let the garbage collector worry about both how reachable the objects are (a strongly reachable object will never be removed from the cache) and how badly it needs the memory they are consuming.
"A soft reference is exactly like a weak reference, except that it is less eager to throw away the object to which it refers".
Nếu hiểu nguyên văn đại ý trên, có thể hiểu rằng, việc "throw away the object" sẽ không chắc chắn hoàn tất assign cho G.C, G.C sẽ bỏ qua trong lần chạy(cycle) tiếp theo, và sẽ bị thu hồi khi cần thiết (khi thiếu memory). Vậy có thể hiểu, WeakRef khác với SoftRef ở kết quả. WeakRef chắc chắn bị thu hồi ở cycle kế tiếp, và sẽ trả về null khi sử dụng get(), còn SoftRef sẽ chỉ trả về null khi thiếu bộ nhớ.
Tiếp tục với StrongReference, nó là gì?
Hầu hết trong Java, object có tham chiếu đều là StrongRef, nó sẽ không bị thu hồi bởi Garbage Collector khi vẫn còn tham chiếu mạnh đến object đó.
Câu hỏi bonus của anh phỏng vấn: "Khi một ImageView được gán bởi 1 bitmap, thì nó là Weak, Soft hay Strong Reference?"
Tôi đã nghĩ đến 2 trường hợp, hoặc được gán trực tiếp thông qua phương thức decodeBitmap, hoặc load data từ webservice về, vậy nó sẽ là StrongRef, hoặc nó sẽ là WeakRef. Nếu là WeakRef, tức là sau khi sử dụng AsyncTask thực thi, sử dụng WeakRef cho ImageView, lấy dữ liệu bằng phương thức get(), gán giá trị cho ImageView, và release source trong memory bởi G.C.
Bạn sẽ trả lời câu hỏi bonus như thế nào?
Nhận xét
Đăng nhận xét