5

私のアプリのメモリ使用量を分析していて、奇数Drawablesが数メガバイトのヒープを絶えず食べています。ここでMATからいくつかのスクリーンショットです:メモリダンプからプリロードされたシステムドロワブル(ビットマップ)のIDまたは名前を調べる方法

Dominator tree ドミネーターツリー2つのかなり大きなビットマップでは

path_to_gc_roots 上記ビットマップの1

のためのGCのルーツこのビットマップへのパスは、常にヒープ・ダンプに表示されます。私の電話から(、Samsung Galaxy Nexus、OS 4.1.1)、どれくらい長く、どれくらい集中して使用しても問題ありません。

私は既にMAT - を使用してこのビットマップのソースを検索しようとしました。私は見つけることができたすべての有用な情報は、ビットマップのwidthheightだった、それは両方の512×512です: bitmap_info

しかし、我々のアプリは、任意の単一の512×512ドローアブルを持っていません。私はこれがいくつかの "システム"ドロアブルであると仮定します。しかし、正確に何ですか?なぜ彼らはとても大きいの?

私はandroid.content.res.Resourcesクラスのソースコードも見てきました。sPreloadedDrawablesフィールドの検索 - 運もありません。私がメモリダンプから得たのはkeyからsPreloadedDrawablesまでですが、このキーからファイル名やリソースIDを特定することはできません。

だから、私の質問は次のとおりです。

  • は、どのように私は、このビットマップの名前またはIDを確認できますか?

  • この巨大なビットマップは何のために読み込まれ、なぜそれらは常にメモリ内にあるのですか

更新

私はlook at this bitmaps from memory dumpへの道を発見しました。この2つのビットマップは、シンプルなグラデーションです.1つは黒、もう1つは白です。私はこれがHolo.LightHolo.Dark ICSテーマのリソースだと思います。しかし、私の2番目の質問はまだ実際です:なぜこのビットマップは常にメモリにとどまっていますか?アップロードやリサイクルの方法はありますか?

+0

ですか? – toadzky

+0

私はこのビットマップの名前/ IDがこのビットマップのために何がロードされているのか把握しようとしていて、おそらく私のコードから何かをしようとしています – HitOdessit

答えて

0

あなたのプロジェクトに含める必要があるandroid.jarからのこの画像。縦の勾配を持つ2つの正方形があります。 1番目は0x000000から0x272d33まで、2番目は0xe8e8e8から0xfafafaまでです。 android.jar/res/drawable-nodpi/background_holo_dark.pngとbackground_holo_light.pngで見つけることができます。もちろん、あなたのAndroid SDKのバージョンに応じて異なる結果を得ることができます。

+0

これは私の質問に答えませんでしたメモリダンプだけのビットマップ?あなたはこの名前をどうやって見つけましたか? – HitOdessit

+0

リソースがpublicの場合、then idはファイル名です。 android.R.drawable.background_holo_ [dark | light] – toadzky

0

私は彼らがアクティビティのデフォルトの背景であるため、彼らはメモリにとどまると思います。あなたのテーマに異なる背景を指定して、それらがまだそこにあるかどうかを確認してください。

+0

この場合、sime時に2つのテーマがメモリに存在するのはなぜですか? (暗くて明るいテーマ) – HitOdessit

+0

本当にいいアイデアはありません。 – toadzky

0

プリロードされたドロワーブルは、Zygoteによってロードされます。あなたが見

ZygoteInit#preloadResources()

/** 
* Load in commonly used resources, so they can be shared across 
* processes. 
* 
* These tend to be a few Kbytes, but are frequently in the 20-40K 
* range, and occasionally even larger. 
*/ 
private static void preloadResources() { 
    final VMRuntime runtime = VMRuntime.getRuntime(); 

    try { 
     mResources = Resources.getSystem(); 
     mResources.startPreloading(); 
     if (PRELOAD_RESOURCES) { 
      Log.i(TAG, "Preloading resources..."); 

      long startTime = SystemClock.uptimeMillis(); 
      TypedArray ar = mResources.obtainTypedArray(
        com.android.internal.R.array.preloaded_drawables); 
      int N = preloadDrawables(runtime, ar); 
      ar.recycle(); 
      Log.i(TAG, "...preloaded " + N + " resources in " 
        + (SystemClock.uptimeMillis()-startTime) + "ms."); 


      startTime = SystemClock.uptimeMillis(); 
      ar = mResources.obtainTypedArray(
        com.android.internal.R.array.preloaded_color_state_lists); 
      N = preloadColorStateLists(runtime, ar); 
      ar.recycle(); 
      Log.i(TAG, "...preloaded " + N + " resources in " 
        + (SystemClock.uptimeMillis()-startTime) + "ms."); 
     } 
     mResources.finishPreloading(); 
    } catch (RuntimeException e) { 
     Log.w(TAG, "Failure preloading resources", e); 
    } 
} 

、プリロードのDrawableは、あなたがこれらのビットマップの名前/ IDをたくない理由com.android.internal.R.array.preloaded_drawables

関連する問題