2012-01-11 3 views
1

레이아웃에 이미지가 (대부분)있는 애플리케이션이 있습니다. 내가 안다시피, 안드로이드는 활동이 더 이상 필요하지 않을 때 기억을 해방하기로되어있다. 따라서 Activity가 onPause()를 수동으로 수행 할 때 내 앱의 레이아웃에서 사용한 Drawables를 공개하지 않습니다. Android에서이 작업을 수행해야합니다.Android - 메모리 관련 문제가 더 적습니다.

가 그럼, 메모리 상태를 확인하려면이 코드를 사용 : 모든 창조 활동에

{ 
    ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
    android.app.ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo(); 
    activityManager.getMemoryInfo(memoryInfo); 

    Log.i("MEMCHECK", " memoryInfo.availMem " + memoryInfo.availMem + "\n"); 
    Log.i("MEMCHECK", " memoryInfo.lowMemory " + memoryInfo.lowMemory + "\n"); 
    Log.i("MEMCHECK", " memoryInfo.threshold " + memoryInfo.threshold + "\n"); 

    android.os.Debug.MemoryInfo[] memoryInfoArray = activityManager.getProcessMemoryInfo(pids); 
    for(android.os.Debug.MemoryInfo pidMemoryInfo: memoryInfoArray) { 
     Log.i("MEMCHECK", " pidMemoryInfo.getTotalPrivateDirty(): " + pidMemoryInfo.getTotalPrivateDirty() + "\n"); 
     Log.i("MEMCHECK", " pidMemoryInfo.getTotalPss(): " + pidMemoryInfo.getTotalPss() + "\n"); 
     Log.i("MEMCHECK", " pidMemoryInfo.getTotalSharedDirty(): " + pidMemoryInfo.getTotalSharedDirty() + "\n"); 
} 

를, 메모리 사용량이 증가 (힙 - getTotalPrivateDirty()). 내 응용 프로그램에서 메모리의 모든 kb는 정말 중요하기 때문에 나는 이것을하고 싶지 않습니다. 이 콜백 처리 또한

: 단지 그런

Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() { 
    public void onPictureTaken(byte[] imageData, Camera c) { 

    } 
} 

빈. 힙은 10MB에서 20MB로 증가합니다. 100 %. 이게 정상인가? 피하는 법?

+0

을 확인하는 새로운 활동 (간단한)에서 메모리를 확인, 활동의 메모리가 destroyd되면 자동으로 청소 가정 . 문제는 Android가 가비지 수집시기를 정확히 모르는 것입니다. 일시 중지/삭제 된 활동은 메모리가 필요하거나 gc'ed 될 때까지 gc'ed되지 않을 수도 있습니다. 이것을 아는 (쉬운) 방법은 없습니다. – THelper

답변

1

) 및 콜백 대신 가비지 컬렉터에 의존, 수동으로 메모리를 확보 할 필요가있다. 또한보기의 컨텍스트를 관리해야합니다. 가능한 한 가장 낮은 레벨에서 컨텍스트를 지정하는 경우, 뷰가 액티비티에서만 사용되는 것처럼 액티비티 컨텍스트를 지정하고, 리스너/콜백을 뷰에서만 사용해야하는 경우 뷰 컨텍스트를 할당해야합니다.

또한 수동으로 xml 드로어 블을 바인딩 해제 할 수 있습니다.

+0

지정할 수 있습니까? 어떻게 이미지의 기억을 풀어 주나요? 마지막으로 비트 맵에서'recycle' 호출을 선택해도 메모리가 즉시 해제되지 않습니다 ... – WarrenFaith

+0

@jitendra sharma : 더 자세히 설명해 주시겠습니까? "보기가 활동에서만 사용되는 경우와 마찬가지로 활동 컨텍스트를 지정하고, 청취자/콜백을 뷰에서만 사용해야하는 경우 뷰 컨텍스트를 할당해야합니다. " 제발 고마워. –

+0

[This posts] (http://stackoverflow.com/a/6779164/741249)에는 코드 예제가 있습니다. 또한 더 자세한 설명이 여기에 (http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html) – THelper

0

Android는 onPause 및 onStop에서 다른 앱에 메모리가 필요한 경우 사용되지 않는 활동을 종료합니다. onPause 또는 onStop을 재정 의하여 수동으로 메모리를 확보 할 수 있습니다.

+1

부분적으로 정확합니다. 앱에서 실행중인 앱이 앱인 경우에도 사용 가능한 전체 메모리를 얻지는 못합니다. 각 VM 인스턴스는 사용할 수있는 메모리의 일부만을 가지고 있습니다 ... – WarrenFaith

-1

은 자주,이 메모리를 많이 절약 할 수 정적 최종 변수로 사용하려고, 이미지의 경우

+0

실제로 통계를 사용하면 메모리 누수의 원인이 될 수 있습니다. [this post] (http://stackoverflow.com/q/5504071/741249) – THelper

0

나는 검사가 유효을 위해 내가 당신의 접근 방식을 생각하지 않는다 마무리()를 호출하고

관련 문제