안녕하세요. 초짜 안드로이드 개발자 입니다.
차제 테스트 용으로 플랫폼에 포함되어 들어가는 모듈의 VM 메모리 릭으로 인해 특정 서비스 모듈에
영향을 줄수 있는가요?
간략히 상황을 설명 드리자면 터치 이벤트를 약 20만회정도 수행하는 테스트 모듈이 있는데
이 테스트 모듈에서 매번 객체할당을 해서 메모리 문제를 발생시켰고 그로 인해서 InputMethod 서비스 모듈이
죽었기 때문에 책임을 져라! 이런 상황입니다.
그런데 제가 아는 지식선에선 도저히 이해가 안되는 부분이 있습니다.
첫째, 일반 APP가 제 아무리 객체를(단순 String객체) 많이 할당 한다한들 VM heap안에서 만 문제 될뿐 이라 생각하는데
APP에 Out of Memory 발생에 영향을 줄 수있는가요? 그것도 InputMehod Service를..
둘째, 위 내용과 이어지는 내용으로, 코드는 간단하며 아래와 같습니다. 일반적으로 함수안에 선언된 Local Variable은 호출시
stack에 생성되었다가 함수 호출이 끝나면 정리가 되는 것으로 알고있는데, 백만번, 천만번이 된들 VM Heap에 크게
무리가 갈가요?
TestModule extends Activity{
---생략---
public void onClick(View v){
String a = "a";
String b = "b";
String c = "c";
String d = "d";
}
}
셋째, 로그를 보면 해당 InputMethod가 signal 11, 즉 segmentation fault로 죽어버린 것 같은데
아마 다른 JNI를 통해서 동작하는 Method에의해 메모미릭 발생 했거나, Heap영역이 깨졌거나
이런 이유로 추측합니다.
--- Log---
...
01-07 14:46:48.201 E/dalvikvm( 313): OutOfMemory: max: 50331648(49152 K), total: 47718368(46599 K), alloc: 44104392(43070 K), extAlloc: 2660176(2597 K)
01-07 14:46:48.872 E/dalvikvm-heap( 313): Out of memory on a 48-byte allocation.
...
01-07 14:46:48.902 E/dalvikvm( 313): VM aborting
01-07 14:46:49.002 I/DEBUG ( 121): Get a Crash debugging Information
01-07 14:46:50.373 W/dalvikvm( 313): threadid=13: spin on suspend #1 threadid=9 (pcf=0)
01-07 14:46:50.824 I/DEBUG ( 121): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
01-07 14:46:50.824 I/DEBUG ( 121): pid: 313, tid: 429 >>> com.aaaa.android.inputmethod <<<
01-07 14:46:50.824 I/DEBUG ( 121): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr deadd00d
VM이나 객체지향 개념중에 먼가 하나 모르고 있는 부분이 있는건지
먼가 좀 찜찜하네요~
두서 없는글 읽어주셔서 감사합니다~~
공지 다 읽었습니다..^^*




두번째는 답해 드릴 수 있을 것 같네요
저도 요새 메모리 릭 때문에 최대한 릭이 발생하지 않는 방법으로 앱을 개발하고 있는데
요점은 간단합니다.
저렇다 하더라도 실제 GC 발생이 일어나지 않아서 조금씩 쌓인다고 합니다.
그래서 WeakReference 나 SoftReference 를 사용해서 강제적으로 GC 발생을 시킨다고 하는군요.
근데 정말 말씀처럼 단순 string 객체가 10만번 생성됐다고 해서 OoM 이 발생이 되는경우는 생각 안해봤네요..
제가 테스트 했을때는 6천개 정도의 String 리스트에서는 문제가 없었는데...