5

Google 애플 리케이션의 메모리 사용량을 분석 중이며 이상한 숫자 인 Drawables을 발견했으며 수십 메가 바이트의 힙을 지속적으로 "먹습니다". 여기에 몇 가지 스크린 샷 MAT에서있다 :메모리 덤프에서 미리로드 된 시스템 드로어 블 (비트 맵) ID 또는 이름을 찾는 방법

Dominator tree 지배자 나무 2 꽤 큰 비트 맵 위의 비트 맵이 항상 비트 맵

중 하나에 뿌리를 GC하는

path_to_gc_roots 경로은 힙 덤프에 나타납니다 내 휴대 전화 (삼성 갤럭시 넥서스, OS 4.1.1)에서 얼마나 오래 또는 얼마나 집중적으로 우리의 애플 리케이션을 사용합니다.

나는 행운을 들이지 않고 MAT를 사용하여이 비트 맵의 ​​소스를 이미 검색하려고했습니다. bitmap_info

을하지만 우리의 응용 프로그램은 단일 512 × 512 드로어 블이없는 : 내가 찾을 수 있었다 모든 유용한 정보를 width와 비트 맵의 ​​height했다, 그것은 모두 512 × 512이다. 나는 이것이 "시스템"드로어 블이라고 가정합니다. 그러나 정확하게 무엇? 왜 그렇게 커요?

또한 android.content.res.Resources 클래스의 소스 코드를보고 sPreloadedDrawables 필드의 사용법을 검색했습니다. 또한 운이 없었습니다. 내가 메모리 덤프에서 얻은 것은 key에서 배열은 sPreloadedDrawables이지만 파일 이름이나 리소스 ID를이 키로 결정할 수는 없습니다.

그래서, 내 질문은 다음과 같습니다

  • 는 어떻게이을 비트 맵의 ​​이름 또는 ID를 확인할 수 있습니까?

  • 이 거대한 비트 맵이로드되고 왜 항상 메모리에 남아있는 이유?

업데이트는 :

나는 look at this bitmaps from memory dump 할 수있는 방법을 발견했다. 이 두 비트 맵은 간단한 그라디언트, 하나는 검정, 다른 하나는 흰색입니다. 이 내용은 Holo.LightHolo.Dark ICS 테마의 리소스라고 생각합니다. 그러나 두 번째 질문은 여전히 ​​실제입니다 : 왜이 ​​비트 맵은 항상 메모리에 남아 있습니까? 업로드하거나 재활용 할 수있는 방법이 있습니까?

+0

가 왜 이러한 비트 맵의 ​​이름/ID를 원하는가인가? – toadzky

+0

이 비트 맵에 대해 무엇을로드했는지 알기 위해이 비트 맵의 ​​이름/ID를 원하고 내 코드에서 무언가를하려고 시도했습니다. – HitOdessit

답변

0

android.jar의이 그림은 프로젝트에 포함해야합니다. 수직 기울기가있는 두 개의 사각형이 있습니다. 첫 번째는 0x000000에서 0x272d33까지, 두 번째는 0xe8e8e8에서 0xfafafa까지입니다. android.jar/res/drawable-nodpi/background_holo_dark.png 및 background_holo_light.png에서 찾을 수 있습니다. 물론 Android SDK 버전에 따라 다른 결과를 얻을 수 있습니다.

+0

이 질문에 대한 답변이 없습니다. ** **이 이름을 찾는 방법 메모리 덤프가있는 비트 맵? 이 이름을 어떻게 찾았습니까? – HitOdessit

+0

리소스가 공용 인 경우 id는 파일 이름입니다. android.R.drawable.background_holo_ [dark | light] – toadzky

0

그들은 활동의 기본 배경이기 때문에 그들이 메모리에 머무르는 것으로 생각합니다. 테마에 다른 배경을 지정하고 해당 테마가 아직 있는지 확인하십시오.

+0

이 경우, 한 시간에 두 개의 테마가 메모리에있는 이유는 무엇입니까? (어둡고 가벼운 테마) – 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); 
    } 
} 

, 사전로드 된 드로어 블은 com.android.internal.R.array.preloaded_drawables