이미지 처리라기 보단..
그 이미지를 썻을 때 Heap Memory 반환이 될 수 있도록 처리해주는 팁이다.
아래 내용으로 Activity 에서 찍어보면
Log.i("★", "memory size : " + ((ActivityManager)this.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass());
Log.i("★", "dalvik heap 최대크기 : " + Runtime.getRuntime().maxMemory());
Log.i("★", "dalvik heap 영역크기 : " + Runtime.getRuntime().totalMemory());
Log.i("★", "dalvik heap 여유 공간 : " + Runtime.getRuntime().freeMemory());
Log.i("★", "dalvik heap 할당된 크기 : " + (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()));
Log.i("★", "getNativeHeapSize : " + Debug.getNativeHeapSize());
Log.i("★", "getNativeHeapFreeSize : " + Debug.getNativeHeapFreeSize());
Log.i("★", "getNativeHeapAllocatedSize : " + Debug.getNativeHeapAllocatedSize());
아래와 같이 출력된다. 흠................
05-23 16:11:20.901: I/★(17767): memory size : 64
05-23 16:11:20.901: I/★(17767): dalvik heap 최대크기 : 67108864
05-23 16:11:20.901: I/★(17767): dalvik heap 영역크기 : 60309504
05-23 16:11:20.901: I/★(17767): dalvik heap 여유 공간 : 13493048
05-23 16:11:20.901: I/★(17767): dalvik heap 할당된 크기 : 46816608
05-23 16:11:20.901: I/★(17767): getNativeHeapSize : 32321536
05-23 16:11:20.906: I/★(17767): getNativeHeapFreeSize : 506104
05-23 16:11:20.906: I/★(17767): getNativeHeapAllocatedSize : 31815432
아래 이미지는 위 내용의 이해를 도울수 있을듯하여 다른 블로그에서 발췌해왔다.
Android 메모리 모델
Android의 메모리 모델은 운영체제의 버전에 따라 Honeycomb(Android 3.0) 미만의 메모리 모델과 Honeycomb 이상의 메모리 모델, 두 가지로 나뉜다. 먼저 Honeycomb 미만의 메모리 모델을 살펴보자.
요즘 우리쪽 앱이 이 영역을 넘치는 모양인지 outofmemory error 가 나서 확인해보았다.
위 에러가 나면 앱이 뻗어버리는데, 이유인즉슨 사용가능한 메모리 공간을 넘어섯다는것.
너무 사용했거나, 사용하고 불필요한것들을 반환해주지 않아서 이런일이 발생한다고 구글에선 말하고있다...................
아 뭐 말이 쉽지.. ㅋㅋ
아무튼 이곳저곳 뒤지다가 givenjazz 라는 분께서 유용한 유틸을 만들어주셧길래 사용해보았고, 효과가 나름 ? 있는듯 하여 포스팅해본다.
사용방법은... 아래 소스를 그대로 긁어서 클래스를 만들고.
Activity 가 finish() 를 호출하거나 destroy 되는 시점에서 아래 두줄을 호출하여 리소스를 반환해준다는 점.
RecycleUtils.recursiveRecycle(getWindow().getDecorView());
System.gc(); << 이녀석은 좀 쌩뚱맞지만.. 가비지컬렉션 이라고해서, 쓰레기들을 청소?해준다는 개념으로다가 함께...
하지만 난 아직 이걸로도 에러가 완전히 잡히지 않았다는 점!! 아나..
============================================================================================================
<소스>
package xxx.xxx.xxx;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ImageView;
/**
* @author givenjazz
* Bitmap 이미지 사용범위에 대해 앱 종료시 호출되며
* 리소스 반환 역할을 해주어 메모리 관리를 돕느다.
*
*/
public class RecycleUtils {
private RecycleUtils(){};
public static void recursiveRecycle(View root) {
if (root == null)
return;
root.setBackgroundDrawable(null);
if (root instanceof ViewGroup) {
ViewGroup group = (ViewGroup)root;
int count = group.getChildCount();
for (int i = 0; i < count; i++) {
recursiveRecycle(group.getChildAt(i));
}
if (!(root instanceof AdapterView)) {
group.removeAllViews();
}
}
if (root instanceof ImageView) {
((ImageView)root).setImageDrawable(null);
}
root = null;
return;
}
}
============================================================================================================
댓글
댓글 쓰기