OUT OF MEMORY LÀ LỖI GÌ

     

Việc rò rỉ bộ lưu trữ trong app android là khá dễ dàng xảy ra. Developer có thể không nhận ra đã để bộ nhớ bị rò rỉ từng ngày. Cho tới khi dancing ra một nước ngoài lệ như vậy này...

Bạn đang xem: Out of memory là lỗi gì

java.lang.OutOfMemoryError: Failed lớn allocate a 4308492 byte allocation with 467872 không tính phí bytes and 456KB until OOMat dalvik.system.VMRuntime.newNonMovableArray(Native Method)at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:609)at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:444)at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:988)at android.content.res.Resources.loadDrawableForCookie(Resources.java:2580)at android.content.res.Resources.loadDrawable(Resources.java:2487)at android.content.res.Resources.getDrawable(Resources.java:814)at android.content.res.Resources.getDrawable(Resources.java:767)at com.nostra13.universalimageloader.core.DisplayImageOptions.getImageOnLoading(DisplayImageOptions.java:134)Exception này có phải bảo rằng bitmap quá lớn đối với hệ thống Android?

Thật không may, khi nhận được một OutOfMemoryError, thì nó thường sẽ có nghĩa là, 9/10 đã xảy ra rò rỉ cỗ nhớ. Ấn tượng đầu tiên khi đọc đoạn Stack trace trên, cho rằng bitmap thừa lớn, bởi thế là nhận định sai lầm.

Rò rỉ bộ nhớ là gì?

A failure in a program to release discarded memory, causing impaired performance or failure.

Tức là: một lỗi trong công tác khi giải phóng bộ lưu trữ không dùng tới, làm tác động đến hiệu năng hệ thống hoặc xảy ra lỗi.

Rò rỉ bộ nhớ xảy ra trong Android?

Rò rỉ bộ nhớ trong app android thực sự khá dễ dãi để xảy ra. Vấn đề lớn số 1 là các đối tượng người sử dụng Context.

Một vệt hiệu chú ý lớn đến thấy bộ nhớ lưu trữ được sử dụng gia tăng trong ứng dụng, như biểu đạt trong Androids Memory Monitor:

Androids Memory Monitor của ứng dụng xẩy ra rò rỉ bộ nhớ

*

Androids Memory Monitor sau khoản thời gian sửa lỗi rò rỉ bộ nhớ

*

Trong đồ thị đầu tiên, ta có thế thấy ứng dụng sẽ không lúc nào có thể lấy lại một số bộ nhớ đã sử dụng. Nó được sử dụng lên đến khoảng 300MB trước thời điểm xẩy ra OutOfMemoryError. Biểu đồ thiết bị 2 cho thấy rằng ứng dụng có thể thu dọn rác, mang lại một số bộ lưu trữ đã hỗ trợ và sử dụng bộ nhớ khá ưa thích hợp.

Làm chũm nào nhằm tránh rò rỉ cỗ nhớ?

Tránh truyền thêm đối tượng người dùng Context vào Activity hoặc Fragment.KHÔNG BAO GIỜ tạo ra hoặc lưu giữ một đối tượng người dùng Context hoặc View vào một trở nên static. Đây là lốt hiệu trước tiên của rò rỉ bộ nhớ.

private static TextView textView; //DO NOT vì chưng THIS private static Context context; //DO NOT vì chưng THISLuôn luôn unregister các listener trong cách thức onPauser() hoặc onDestroy(). Nó bao gồm các listener của Android, tới những thứ như Location service hay những service quản lý hiển thị và các listener được tuỳ chỉnh riêng.Không lưu lại trữ những tham chiếu bạo dạn (strong refenrence) tới các activity trong những AsyncTask hoặc những background thread. Cũng chính vì các Activity có thể bị đóng góp lại, tuy nhiên AsyncTask vẫn thường xuyên thực hiện và giữ tham chiếu tới Activity.Sử dụng Context của áp dụng (getApplicationContext()) thay vày Context xuất phát điểm từ một Activity nếu bao gồm thể.Cố gắng tránh sử dụng các non-static inner class. Tàng trữ một tham chiếu tới một cái gì đó như Activity tuyệt View phía bên trong lớp này rất có thể dẫn mang lại rò rỉ bộ nhớ. Thực hiện WeakReference nếu phải tham chiếu tới chúng.

Làm nỗ lực nào nhằm sửa lỗi rò rỉ cỗ nhớ?

Sửa lỗi rò rỉ bộ nhớ lưu trữ sẽ yêu cầu thực hiện một vài hoạt động, rất nhiều lần thử và lỗi. Rò rỉ bộ lưu trữ có thể rất nặng nề để theo dõi. Như mong muốn là gồm một vài nguyên lý trợ giúp xác minh một rò rỉ tất cả thể.

Xem thêm: Tiểu Sử Mr Beast Là Ai, 6000, Cây Cối,, Mrbeast Là Ai

Mở apk Studio, nhảy sang tab apk Monitor.Chạy áp dụng và lựa chọn nó tự danh sách các ứng dụng.Thao tác một số hành vi trong ứng dụng.Theo dõi quá trình ứng dụng sử dụng bộ nhớ cho đến khi xẩy ra OutOfMemoryException.Click tab Memory trong game android Monitor.

*

Xuất hiện biểu đồ ban đầu được vẽ. Khi sẵn sàng chuẩn bị thì click “Initiate GC” (biểu tượng xe tải rác màu cam).Click “Dump Java Heap” và chờ đợi một vài giây. Hành động này sẽ tạo nên một tập tin .hprof để phân tích áp dụng bộ nhớ.Cài đặt MAT để xem phân tích tệp tin .hprofChạy lệnh sau để biến hóa từ file .hprof sang tệp tin MAT.

./hprof-conv path/file.hprof exitPath/heap-converted.hprofMở tệp tin trong MAT và lựa chọn “Leak Suspects Report".

*

Click vào thanh 3 greed color trên cùng “Create a histogram from an arbitrary phối of objects”, đang thấy danh sách các đối tượng người dùng được chiếm cỗ nhớ.

*

Lọc các đối tượng người dùng bằng tên class.

*

Nhìn hình bên trên thấy rằng gồm 9 đối tượng người tiêu dùng VideoDetailActivity, ví dụ là không đúng vào khi chỉ nên có 1 đối tượng. Để tìm đông đảo thứ giữ lại tham chiếu cho tới VideoDetailActivity, bấm vào phải vào cống phẩm và chọn “Merge Paths to Shortest GC Root”, sau đó click vào “exclude all phantom/weak/soft etc. References”.

*

Từ tin tức dưới đây, rất có thể thấy một DisplayListener đã có được register tuy vậy không lúc nào được unregistered.

Xem thêm: Bố mẹ cần xử lý như thế nào khi tình trạng biếng ăn của bé kéo dài?

*

Vì vậy, rò rỉ bộ nhớ được giải quyết bằng phương pháp gọi unregistered cho listener đã có được register.

DisplayManager displayManager = (DisplayManager) mContext.getSystemService(Context.DISPLAY_SERVICE); displayManager.unregisterDisplayListener(listener);Không phải toàn bộ các rò rỉ bộ lưu trữ được search ra dễ dàng, một trong những sẽ khó khăn hơn. Có tương đối nhiều công nắm khác giúp đỡ cho việc tìm kiếm rò rỉ bộ nhớ, hoàn toàn có thể xem qua tại: http://developer.android.com/intl/vi/tools/performance/comparison.html