2011-08-30 6 views
23

나는 인터넷에서 음악을 스트리밍하는 앱을 만들고 있습니다 ... 내 앱은 많은 일을하며 이렇게 구성되어 있습니다. 탭보기가 있고 모든보기가 매번 메모리에 할당되므로 탭을 통해 탐색합니다. 이전 상태 (모든 탭에서 노래, 인터넷 뉴스 등의 정보를 찾을 수있는 웹보기도 열 수 있음)를 찾습니다. 메모리 작업이 늘어나고 사용자 친화적 인 응용 프로그램이됩니다.주의를 기울인 후 안드로이드 가이드 다음 메모리 누수를 피하기 위해, 나는 힙 직업을 보려고했는데 내 애플은 최대 3.5MB의 메모리를 할당하고 할당 된 힙 크기는 4.5 - 4.6MB임을 발견했다 ... 나는 에뮬레이터에서 작업하고있다. 그들은별로 생각하지 않지만 때로는 내 앱이 LogCat에서 다시 시작되어 이상한 메시지가 표시됩니다.Android 성장 힙 조각 경우

Grow heap (frag case) to 3.373 for 19764-byte allocation 

무엇입니까? 에뮬레이터 문제? 또는 다른 것? 너무 많은 메모리를 사용하고 있습니까?

어떤 도움 : 최대 힙 크기는 장치에 따라 달라

답변

35

를위한 미리 감사합니다 (당신은 Runtime.getRuntime().maxMemory()를 호출하여 그 값을 얻을 수 있습니다)하지만 32메가바이트 주위에 아마. 메모리를 절약하기 위해 Android는 모든 앱에 최대 메모리를 자동으로 할당하지 않습니다. 대신 앱이 더 많은 메모리를 필요로 할 때까지 기다린 다음 필요에 따라 최대 메모리에 도달 할 때까지 더 많은 힙 공간을 제공합니다. 내가 본 메시지는 Grow heap입니다.

많은 양의 메모리를 할당하고 해제하면 조각화 문제가 발생할 수 있습니다. 위키 피 디아는 괜찮은 설명이 here이지만 기본적으로 모든 메모리가 하나의 청크가 아니라 필요한 메모리를 사용할 수 있음을 의미합니다. 따라서 힙을 성장시킬 필요가 있습니다.

귀하의 질문에 대답하기 위해, 아마 에뮬레이터 문제가 아닙니다. 그것은 프로그램의 특성이며, 약간의 메모리가 무거워 보입니다. 그러나 이것은 나쁜 것이 아닙니다. 나는 webviews를 가진 다수 탭을 위해 3-5MB를 사용하는 것은 너무 많이다는 것을 생각하지 않는다.

+0

오 답변 해 주셔서 감사합니다 ^^ 왜 나쁜 것이 아니겠습니까? 이런 일이 생기면 내 앱이 종료됩니다 ...이게 나쁘다고 생각합니다 ... 내 잘못입니까? 또 다른 메시지를받습니다. heapworker가 쐐기로 고정되었습니다 : 13129ms가 Landroid/media/MediaPlayer 내부에서 보냈습니다 .finalize() V ...이게 무엇인지 아십니까? – Erenwoid

+0

예, 앱이 종료되면 문제가 발생합니다. 나는 ~ 4MB의 힙을 여러 웹 페이지에 사용하는 것이 나쁘지는 않다는 것을 의미한다. 'HeapWorker'문제에 대해 너무 많이 알지 못합니다. 일반적으로 할당 된 메모리를 추적하고 사용되지 않는 객체에 대해 가비지 수집기를 실행합니다. 내 생각 엔 스레드 중 하나가 모든 CPU를 사용하고 있으며'MediaPlayer'에'finalize()'를 실행할 시간이 주어지지 않았습니다.이 함수는 13 초가 걸리지 않아야합니다. –