Memory Leak Là Gì

     

Xây dựng một áp dụng Android rất dễ dàng nhưng tạo nên thực sự hóa học lượng, tiêu hao ít tài nguyên thì không dễ như vậy. Khi mới bắt đầu bước những bước đi đầu tiên vào sự nghiệp lập trình, hầu như chúng ta chỉ lưu ý đến việc làm thế nào xây dựng được những nhân kiệt của ứng dụng, loại mà hiện hữu ra trước đôi mắt mọi fan mà ít khi lưu ý đến những gì mà lại mọi bạn không nhận thấy như việc tối ưu hóa ứng dụng hoặc như là ở bài viết này là vấn đề xử lý những sự việc của memory leak. Ví như điều này diễn ra trong thời gian dài sẽ có tác dụng giảm chất lượng của những vận dụng của bạn, khiến nó có thể giật lag thậm chí là dừng hẳn ứng dụng. Vì vậy lưu ý đến hiệu suất của ứng dụng là một trong những điều thực sự siêu quan trọng.

Bạn đang xem: Memory leak là gì

Ở nội dung bài viết này, họ sẽ cùng nhau tìm hiểu về memory leak. Nó là gì, lý do lại tạo ra nó? Nó có tác hại như thế nào? gần như trường hợp nào thường gây nên nó trong Android?

I. Nguyên nhân Java không chống ngừa memory leak?

Trong Android, chúng ta hiếm khi viết code bằng C tốt C++, những ngữ điệu mà bạn phải tự mình phân bổ bộ nhớ và xử lý những sự việc liên quan mang lại chúng. Java bắt đầu là ngôn ngữ chính của app android và may thay, Java biết phương pháp để làm bộ nhớ lưu trữ sạch đang hơn nhờ vào garbage collector. Đây là một trình dọn dẹp bộ nhớ trong Java. Nó sẽ thu dọn những đối tượng người sử dụng không còn được thực hiện nữa nhằm giải phóng tài nguyên cho ứng dụng. Xích míc nhỉ, tại sao trong Java đã bao gồm garbage collector giúp họ dọn dẹp các đối tượng người sử dụng rồi mà lại phải suy xét vấn đề memory leak, garbage collector mắc lỗi sao?

Không, chắc chắn rằng không, garbage collector tốt nhất và không có lỗi, lỗi là ở bọn chúng ta, đa số lầm trình viên nhiều lúc vô tình bức tường ngăn garbage collector làm trọng trách của nó là giải phóng bộ nhớ khi phải thiết.

II. Sơ qua về hoạt động của garbage collector

Trước kh khám phá sâu rộng về memory leak, bạn nên biết một chút về kiểu cách mà garbage collecor làm việc. Tư tưởng về garbage collector khá dễ dàng nhưng đầy đủ gì thực sự xẩy ra lại phức hợp hơn nhiều

*

Mỗi ứng dụng app android có một điểm bắt đầu, từ đây các đối tượng được khởi sinh sản và những phương thức được gọi. Một vài ba object được tạo, tiếp đến các object khác cũng được tạo ra từ nó và giữ tham chiếu cho tới nó, v.v...

Vì vậy, mỗi chuỗi tham chiếu được có mặt và chế tác thành một memory tree. Khi garbage hoạt động, nó đi từ gốc memory tree với nó sẽ bình chọn các đối tượng người tiêu dùng có còn liên tham chiếu làm sao tới nó không. Những đối tượng người tiêu dùng không còn được tham chiếu tới chính là rác.

III. Memory Leak là gì? nguyên nhân cần cân nhắc nó?

Nói một cách dễ dàng và đơn giản thì memory leak xảy ra khi chúng ta giữ một tham chiếu cho một đối tượng người dùng sau khi đối tượng người sử dụng đó đã chấm dứt hết trọng trách của nó. Theo tôi, khái niệm dễ dàng và đơn giản chỉ có vậy

Mỗi object có một thời gian sống của chính nó, tiếp nối nó rất cần được rời khỏi bộ nhớ. Tuy nhiên nếu một đối tượng người sử dụng khác đang nắm giữ tham chiếu của đối tượng người dùng này bởi một biện pháp trực tiếp hay con gián tiếp sẽ tạo nên garbage collector ko thể tích lũy được nó, đó đó là nguyên nhân gây ra memory leak.

Tin vui là bạn không cần phải quan tâm rất nhiều đến một số trong những memory leak xẩy ra trong áp dụng của bạn. Không phải toàn bộ những memory leak đều gây ảnh hưởng nghiêm trọng tới áp dụng của bạn.

Một vài memory leak thực sự nhỏ tuổi ( leak một bài bác kilobyte của bộ nhớ), và có một vài thiết bị trong chính game android framework với bạn không cần thiết phải fix chúng. Những vấn đề đó nói chung tác động rất ít mang đến hiệu suất của chúng ta và rất có thể bỏ qua được.

Nhưng cũng đều có một vài dòng khác khiến cho ứng dụng của chúng ta lag, thậm chí còn crash. Đây là các thứ bạn thật sự nên quan tâm.

IV. Điều gì xảy ra trong một memory leak

Khi ứng dụng của bạn được áp dụng và bộ nhớ lưu trữ heap của doanh nghiệp ngày càng tăng lên, một garbage collector nhỏ sẽ được kích hoạt và nỗ lực làm sạch phần nhiều đối tượng đã không còn được sử dụng. Bây giờ, những garbage collector chạy đồng thời và bọn chúng không làm đủng đỉnh ứng dụng của người sử dụng một biện pháp đáng kể. đầy đủ hãy ghi nhớ rằng, càng ít garbage collector thì hiệu suất ứng dụng càng tốt.

Xem thêm: Linh Kiện Điện Tử Có Thể Cho Dòng Điện, Ngược Đi Qua Là Loại Linh Kiện Nào

Nếu ứng dụng của bạn có một vài ba memory leak nghiêm trọng, những garbage collector nhỏ sẽ ko thể thu hồi bộ nhớ, và bộ nhớ lưu trữ heap tiếp tục tăng cần phải kích hoạt các GC lớn hơn. Các garbage collector lớn hơn này được gọi là "stop-the-world", nó nhất thời dừng toàn cục main thread của ứng dụng trong vòng 50ms mang lại 100ms. Trên thời đặc điểm đó ứng dụng của doanh nghiệp trễ và số đông không sử dụng được.

Nếu vấn đề không được giải quyết, sau đó bộ nhớ lưu trữ heap của ứng dụng tiếp tục tăng liên tục cho tới thời điểm nó không còn bộ nhớ để phân bổ trong áp dụng và một OutOfMemoryError sẽ xảy ra và vớ nhiên, áp dụng của các bạn sẽ bị crash.

Khi bạn biết những tác động xấu của memory leak gây ra cho vận dụng của bạn, bạn sẽ hiểu vày sao bọn họ cần cân nhắc nó.

V. Một vài trường thích hợp gây memory leak phổ cập và biện pháp khắc phục chúng

Theo tôi tham khảo nhiều nguồn tài liệu, tất cả vài ngôi trường hợp thịnh hành gây ra memory leak.

Unregister listener

Có các trường vừa lòng bạn đk một listener vào Activity hoặc Fragment nhưng lại quên unregister nó. Điều này dễ gây ra một memory leak lớn. Bạn sẽ cần phải hủy đăng ký các listener tương ứng.

Giả sử bạn phải location update trong áp dụng của bạn. Toàn bộ những gì bạn phải làm là rước LocationManager và đk một listener đến location update.

private void registerLocationUpdates()mManager = (LocationManager) getSystemService(LOCATION_SERVICE);mManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, TimeUnit.MINUTES.toMillis(1), 100, this);Bạn có thể thực thi listener ngay trong Activity và bởi thế LocationManager giữ một tham chiếu đến nó. Hiện thời khi Activity bị diệt bỏ, android framework đang gọi thủ tục onDestroy() bên trên nó mà lại garbage collector thiết yếu xóa bộc lộ của Activity bởi vì LocationManager vẫn đang giữ tham chiếu tới nó.

Xem thêm: C++ Là Gì ? Tìm Hiểu Về Ngôn Ngữ Lập Trình C Tại Sao Cần Học Lập Trình C

Cách xử lý rất solo giản, đó là trong cách tiến hành onDestroy() bạn sẽ cần hủy đăng ký nó. Đây là điều mà hầu hết bọn họ quên hoặc không nghe biết nó.