2017-12-15 20 views
11

AndroidスタジオメモリプロファイラはOthersカテゴリの割り当てを報告します。 https://developer.android.com/studio/profile/memory-profiler.htmlによるとAndroidで `不明 '(` Other`)のメモリリーク?

enter image description here

:その他:システムは分類する方法がわからない、あなたのアプリが使用するメモリ。

我々は深く掘る場合は、同様のメモリフットプリント情報がhttps://developer.android.com/reference/android/os/Debug.MemoryInfo.html#getMemoryStat(java.lang.String)

を使用して、実行時に取得することができますこれは、Android StudioのメモリプロファイラでOthersのように見えますがDebug.MemoryInfoクラスにsummary.private-otherに対応しています。そのパラメータは次のように報告されます:

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

どのカテゴリのメモリ割り当てがそのカテゴリになりますか?明らかにJava、Native、Code、Stack、Graphicsではありません。

私のアプリ(コードベースが非常に大きいので、それを引き起こす特定のコードをピンポイントできない)は、多くのメモリを消費しますが、そのような消費につながる特定のソース/パターンはありますか?

編集1 私は部分的に自分の質問最初の部分に答えることができました:

メモリ割り当ての種類は、そのカテゴリで終わりますか?明らかにJava、ネイティブ、コード、スタック、グラフィックスではない です。

RAM情報もadb shell dumpsys meminfo <your proc name>を使用して取得すると、通常のように見えることができます実験

enter image description here

、私はUnknownが最も可能性の高いPrivate Otherに含まれていることがわかります。次の質問を提起する:Unknownとは何ですか? https://developer.android.com/studio/command-line/dumpsys.html#meminfoによると:

システムは 他のより具体的な項目の一つに分類することができませんでした任意のRAMページ。現在、これにはほとんどがネイティブの 割り当てが含まれています。これは、アドレス空間レイアウトのランダム化(ASLR)によって このデータを収集するときにツールで識別できません。 Dalvikヒープと同様に、UnknownのPss Totalは Zygoteとのアカウント共有を考慮しており、Private Dirtyはあなたのアプリ専用です。

それはまだネイティブ割り当てのようです。識別可能なネイティブ割り当てはNativeカテゴリになりますが、ASLRによってデータが識別できなくなったネイティブ割り当ては、Unknownになります。

主な問題は、しかし、まだ保持している:

私のアプリ(非常に大規模なコードベースでは、私は本当にピンポイント それを引き起こし、特定のコードすることはできません)Otherメモリを大量に消費するが、 ある場合そのような消費に結びつくあるソース/パターンがありますか? Javascriptを有効にしてWebView:私は、このようなぶら下がっスレッド、オープン・カーソル、webviewsと研究の多くの時間後など

答えて

1

としての答えを探しています、私は最終的に高Unknownメモリ消費につながる一つの共通のパターンを見つけました。

以下のサンプルコードは、HTCの一つAPI 19と約120mb三星ギャラクシー注4(API23)で約94mb三星ギャラクシーS8(API-24)上に約100mbunknownメモリの消費につながる。

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 
    } 

次のコマンド意志KBカテゴリ毎秒)で出力Unknownメモリ:

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

出力:

enter image description here

今では、この特定の問題にとどまらず、フォローアップの一連の質問提起:

  1. んOSは目的にdumpsys meminfoUnknown下WebViewのメモリを報告したり、それはバグですか?バグの場合は、特定のOSやAPIレベルに固有のものですか?目的に合っていれば、アクティブな4-5のアクティブなWebViewを持つと、非常に混乱したトレースでアプリがクラッシュします。
  2. javascriptが標準である現代的な典型的なWebページのような高いメモリ消費か、特定のJavaScriptコードによって引き起こされるバグもありますか?実験的には、http://stackoverflow.com/のような簡単なサイトは23mbとなります。ニュースのウェブサイトと同様に、豊富なユーザーエクスペリエンスを備えたページには、120mb-130mbが表示されます。

TLDR:Javascript有効にしてWebViewは、特定のメーカーのunknown多くのメモリを消費につながる一つの共通のユースケースです。

+1

おかげで、それは興味深い発見です! – azizbekian

関連する問題