07/09/2018, 18:15

Phát hiện và sửa lỗi rò rĩ bộ nhớ trong Android

Rò rỉ bộ nhớ trong android Bài báo này là viết về việc tìm kiếm và giải quyết rò rỉ bộ nhớ trong ứng dụng android Vậy rò rỉ bộ nhớ trong android là gì ? Nhiều lần chúng ta nhìn thấy hộp thoại ANR trong khi đang sử dụng ứng dụng, chậm trong ứng dụng của chúng ta, chúng ta cũng có thể nhìn ...

Rò rỉ bộ nhớ trong android

Bài báo này là viết về việc tìm kiếm và giải quyết rò rỉ bộ nhớ trong ứng dụng android

Vậy rò rỉ bộ nhớ trong android là gì ?

Nhiều lần chúng ta nhìn thấy hộp thoại ANR trong khi đang sử dụng ứng dụng, chậm trong ứng dụng của chúng ta, chúng ta cũng có thể nhìn thấy OutOfMemoryError trong Android Studio trong khi đang xây dựng ứng dụng.

Một số Objects không được phát hiện bằng việc thu gom rác như rác. Trong vị trí đó bạn không thể làm bất cứ gì.

Giúp thu gom rác là giúp bạn.

Giữ đối tượng tham chiều không cần thiết nữa là một thực hành xấu, việc giải phóng đối tượng tham chiều sau khi phục vụ là hữu ích cho việc thu gom rác để loại bỏ những đối tượng đó. Đó là cuối cùng giúp chúng ta trong vấn đề rò rỉ bộ nhớ.

Rò rỉ bộ nhớ có thể xảy dễ dàng trên những thiết bi android nếu không cẩn thận trong việc xây dựng ứng dụng, Các thiết bị android được cung cấp với bộ nhớ thấp. Rỏ rỉ bộ nhớ là vấn đề lớn đặt ra cho bất kì ứng dụng android nào.Mặc dù đó là một vấn đề lớn, nó thì không quá khó để tránh nó. Nếu chúng ta coi đó là điều quan trong trong khi xây dựng ứng dụng. Chúng ta cần lưu ý một số thứ trong khi xây dựng ứng dụng miễn phí.

Rò rỉ bộ nhớ có thể được xảy ra theo nhiều trường hợp khác nhau trong android nó là thứ dễ dàng nhất để làm.

Bạn có thể lờ nó đi rò rỉ bộ nhớ, nhưng người dùng của bạn thì không thể`

Lý do xảy ra rò rỉ bộ nhớ.

Lý do quan trong nhất trong việc rò rỉ bộ nhớ là lỗi chủ quan của chúng ta trong việc xây dựng ứng dụng. Chúng ta nên tránh những lỗi chung trong việc xây dựng ứng dụng.

Cái mà chúng ta nên tránh để không tạo sự rò rỉ bộ nhớ là gì ?

Giữ tham chiếu của một đối tượng cụ thể trong background

Không bao giờ giữ tham chiếu của một đối tượng cụ thể trong background, nó dẫn đến việc rò rỉ bộ nhớ.

Việc sử dụng Static View

Không sử dụng Static View vì nó luôn luôn sẵn sàng , Static view chưa bao giờ bị hủy.

Việc sử dụng static context

Không bao giờ sử dụng context là static

public class MainActivity extends AppCompatActivity {
  
  private static Button button; //NEVER USE LIKE THIS
  private static Context context; //NEVER USE LIKE THIS TOO
  
}

Sử dụng Context

Nên cẩn thận trong việc sử dụng context, quyết định context nào là phù hợp tại những nơi cần thiết. Sử dụng application context nếu có thể và sử dụng Activity context chỉ khi cần thiết

Bạn có thể tìm hiểu thêm về context tại đây

Đừng bao giờ quên nói lời tạm biệt listeners sau khi đã sử dụng xong

Đừng quên unregister cho listeners của bạn trong onPause/ onStop/ onDestroy . Nếu bạn không unregister , Nó sẽ luôn luôn giữ activity tồn tại và duy trì việc chờ listeners.

Nên làm như thế này -

public class LocationListenerActivity extends Activity implements LocationUpdate{

  @Override
  public void onLocationChange(Location location){
    
  }
  
  @Override
  public void onStart(){
   LocationListener.get().register(this);
  }
  
  @Override
  public void onStop(){
   LocationListener.get().unregister(this);
  }
}

Việc sử dụng Inner Class

Nếu bạn đang sử dụng inner class, hãy sử dụng lớp này là static vì static class không cần tham chiếu ngầm lớp bên ngoài. Sử dụng inner class như non static làm cho lớp ngoài còn sống nên tốt hơn là tránh. Và nếu bạn sử dụng views là static class , và gửi nó vào trong khỏi tạo và sử dụng nó như là weak reference.

Sử dụng một số thứ như sau -

public class MainActivity extends AppCompatActivity {

TextView textView;
AsyncTask asyncTask;

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);
   textView = (TextView) findViewById(R.id.textView);

   asyncTask = new MyBackgroundTask(textView).execute();
}

@Override
protected void onDestroy() {
   asyncTask.cancel(true);
   super.onDestroy();
}

private static class MyBackgroundTask extends AsyncTask<Void, Void, String> {

   private final WeakReference<TextView> textViewReference;

   public MyBackgroundTask(TextView textView) {
       this.textViewReference = new WeakReference<>(textView);
   }

   @Override
   protected void onCancelled() {
   }

   @Override
   protected String doInBackground(Void... params) {
       return "some text";
   }

   @Override
   protected void onPostExecute(String result) {
       TextView textView = textViewReference.get();
       if (textView != null) {
           textView.setText(result);
       }
   }
}
}

Sử dụng Anonymous Class

Nó tương tự với non static inner class . ví nó rất hữu ích nhưng vẫn tránh sử dụng anonymous class.

Sử dụng Views trong việc thu gom

Tránh việc đặt view trong thu gom vì nó không xóa được bộ nhớ. WeakHashMap lưu views như là giá trị. Từ đó WeakHashMap lưu views như là tham chiếu cố định nên tốt hơn là tránh sử dụng nó. Có tất cả các lý do dẫn tới việc rò rỉ bộ nhớ và sau đó là ANR , lags trong ứng dụng và OutOfMemoryError điều đó cuối cùng dẫn đến việc gỡ cài đặt ứng dụng của bạn bởi người sử dụng

Đừng đổi lỗi cho việc thu gom rác

Nếu việc rò rỉ bộ nhớ xảy ra với những lý do cụ thể trên. Bộ sử lý thu gom không có ý định xử lý những lỗi đó. Đó là lỗi của bạn không cố gắng thực hiện những điều này.

Làm sao đề nhận biết và giải quyết việc rò rỉ bộ nhớ?

Cuộc sống thật tốt khi chúng ta của chưa đươc giới thiệu về việc rò rỉ bộ nhớ.

Dù chúng ta đã được giới thiệu về việc rò rỉ bộ nhớ, chúng ta chỉ cần tìm cách làm sao để xử lý việc này. Làm sao chúng ta phát hiện và sửa nó. Ngay cả việc phát hiện và sửa lỗi với 1 lỗi duy nhất cũng đã là khó khăn, vì thế bạn có thể tưởng tượng nó khó khăn đến thế nào để tìm và sửa lỗi rõ rỉ bộ nhớ trong toàn bộ ứng dụng . Ví thế bạn nên cẩn trọng trong những trường hợp trên.

Cám ơn các bạn đã xem.

Nguồn tham khảo : https://mindorks.com/blog/detecting-and-fixing-memory-leaks-in-android

0