2017-12-15 104 views
11

Phân bổ báo cáo Bộ nhớ Android Studio trong phân loại Others.rò rỉ bộ nhớ `Unknown` (` Other`) trong Android?

enter image description here

Theo https://developer.android.com/studio/profile/memory-profiler.html: Khác: Memory sử dụng bởi ứng dụng của bạn mà hệ thống là không chắc chắn làm thế nào để phân loại.

Nếu chúng ta đào sâu hơn, thông tin bộ nhớ tương tự có thể được lấy ra trong thời gian chạy bằng https://developer.android.com/reference/android/os/Debug.MemoryInfo.html#getMemoryStat(java.lang.String)

Dường như Others trong Android Studio Memory Profiler tương ứng với summary.private-other trong Debug.MemoryInfo lớp. Thông số đó được báo cáo là:

public int getSummaryPrivateOther() { 
      return getTotalPrivateClean() 
       + getTotalPrivateDirty() 
       - getSummaryJavaHeap() 
       - getSummaryNativeHeap() 
       - getSummaryCode() 
       - getSummaryStack() 
       - getSummaryGraphics(); 
     } 

Loại cấp phát bộ nhớ nào kết thúc trong danh mục đó? Nó rõ ràng không phải là Java, Native, Code, Stack và Graphics.

Nếu ứng dụng của tôi (với mật mã cực lớn vì vậy tôi thực sự không thể chỉ định một mã nhất định gây ra nó) tiêu thụ rất nhiều bộ nhớ Other, có một nguồn/mẫu nhất định dẫn đến mức tiêu thụ như vậy không?

Sửa 1 tôi đã có thể phần nào giải đáp phần đầu câu hỏi của riêng tôi:

Những loại phân bổ bộ nhớ kết thúc trong thể loại đó? Nó là rõ ràng không phải là Java, Native, Code, Stack và Graphics.

thông tin RAM cũng có thể được lấy ra sử dụng adb shell dumpsys meminfo <your proc name> và thường trông giống như:

enter image description here

thực nghiệm, tôi có thể thấy rằng Unknown rất có thể đưa vào Private Other. Điều này đặt ra câu hỏi tiếp theo: Unknown là gì? Theo số https://developer.android.com/studio/command-line/dumpsys.html#meminfo:

Bất kỳ trang RAM nào hệ thống không thể phân loại thành một trong số các mục cụ thể khác. Hiện tại, phần này chứa hầu hết các phân bổ tự nhiên không thể xác định bằng công cụ khi thu thập dữ liệu này do Ngẫu nhiên bố cục không gian địa chỉ (ASLR). Giống như vùng heap Dalvik , tổng số Pss cho Không xác định sẽ chia sẻ tài khoản với Zygote và Private Dirty là RAM không xác định chỉ dành riêng cho ứng dụng của bạn.

Dường như nó vẫn là phân bổ gốc. Tuy nhiên, phân bổ Gốc có thể nhận dạng được kết thúc trong danh mục Native, phân bổ Gốc có dữ liệu không còn có thể nhận dạng do ASLR dường như kết thúc trong Unknown.

Câu hỏi chính tuy nhiên vẫn giữ:

Nếu ứng dụng của tôi (với codebase vô cùng lớn vì vậy tôi có thể không thực sự pin điểm một mã nào đó gây ra nó) tiêu thụ nhiều bộ nhớ Other, là có một nguồn/mẫu nào đó dẫn đến tiêu thụ như vậy không? Tôi đang tìm kiếm câu trả lời như đề treo, con trỏ mở, WebViews và vv

Trả lời

1

Sau nhiều giờ nghiên cứu, cuối cùng tôi đã tìm thấy một mô hình phổ biến mà dẫn đến tiêu thụ bộ nhớ Unknown cao: WebView với kích hoạt Javascript .

Mã mẫu sau đây sẽ dẫn đến tiêu thụ khoảng 100mb bộ nhớ unknown trên HTC One API 19 và khoảng 120mb trên Samsung Galaxy Note 4 (API23) và khoảng 94mb trên Samsung Galaxy S8 (API-24):

val webView1 = findViewById<WebView>(R.id.webview_1) 
    webView1.settings.javaScriptEnabled = true 
    webView1.webViewClient = WebViewClient() 
    findViewById<Button>(R.id.load_webview_1).setOnClickListener { 
     webView1.loadUrl("http://www.nbcsports.com/") // can be any arbitrary URL 
    } 

lệnh sau sẽ ra Unknown bộ nhớ trong thể loại kb mỗi giây):

while sleep 1; do adb shell dumpsys meminfo com.dkarmazi.memoryleakerapp | grep Unknown; done 

Output:

enter image description here

Bây giờ nó làm nảy sinh một loạt các câu hỏi tiếp theo mà đi xa hơn vấn đề này cụ thể:

  1. Liệu OS nhớ báo cáo WebView dưới Unknown trong dumpsys meminfo về mục đích hay đó là một lỗi? Nếu đó là lỗi, liệu nó có cụ thể đối với một số mức OS và API nhất định không? Nếu nó là mục đích, sau đó có 4-5 hoạt động WebView s sẽ sụp đổ các ứng dụng với dấu vết rất khó hiểu.
  2. Mức tiêu thụ bộ nhớ cao như vậy đối với một trang web điển hình hiện đại có javascript bình thường hay cũng có một lỗi được kích hoạt bởi mã javascript nhất định? Thực tế, các trang web đơn giản như http://stackoverflow.com/ mất 23mb. Các trang có trải nghiệm người dùng phong phú hơn, giống như bất kỳ trang web tin tức nào, sẽ mất tới 120mb-130mb.

TLDR: WebView với kích hoạt Javascript là một trong những trường hợp sử dụng phổ biến mà dẫn đến tốn rất nhiều bộ nhớ trên unknown nhà sản xuất nhất định.

+1

Cảm ơn bạn đã điều tra, đó là tìm kiếm thú vị! – azizbekian