2011-02-09 4 views
0

서버에서 데이터를 약 10-12KB 요청 (onResume에서 서버로부터 데이터를 받기 시작하는 스레드가 있습니다)하고 표 형식으로 그릴 수있는 응용 프로그램이 있습니다. 보기에. 각보기 행은 5 TextView 및 2 Drawable으로 구성됩니다.안드로이드에서 메모리 부족 2.3.2

이제 응용 프로그램은 2.2 및 이전 버전의 OS에서 완벽하게 작동하지만 onCreate 메소드의 메모리 부족 오류 (2.3.2)에서 충돌합니다 (레이아웃을 R.main에서 설정하는 중). 오류를 다시 발생시키는 방법은 기기를 계속 회전시켜 (약 20-25 회) 앱이 세로 모드에서 가로 모드로 전환되도록 유지하는 것입니다. DDMS 출력을 살펴본 결과 패턴이 보입니다. 나는 꽤 빨리 세로 및 가로 모드 사이를 전환하면 ... 시스템은 GC 메시지의 많은을 출력 단지 충돌하기 전에 같은

02-09 12:20:08.617: DEBUG/dalvikvm(109): GC_EXPLICIT freed 426K, 47% free 6201K/11655K, external 4752K/5934K, paused 122ms 

그러나 같은 메시지를 보여주는 ... GC를 실행하려고

02-09 12:20:12.875: DEBUG/dalvikvm(184): GC_EXTERNAL_ALLOC freed 112K, 52% free 3022K/6215K, external 5127K/5136K, paused 110ms 02-09 12:20:12.933: DEBUG/dalvikvm(28163): GC_EXTERNAL_ALLOC freed 108K, 34% free 7894K/11847K, external 20252K/20560K, paused 155ms 02-09 12:20:13.007: INFO/dalvikvm-heap(28163): Clamp target GC heap from 32.031MB to 
32.000MB 02-09 12:20:13.007: DEBUG/dalvikvm(28163): GC_FOR_MALLOC freed 2K, 34% free 7891K/11847K, external 20254K/20560K, paused 47ms 02-09 12:20:13.074: DEBUG/dalvikvm(28163): GC_EXTERNAL_ALLOC freed 0K, 34% free .... 

더 많은 그런 선. 그 다음 충돌합니다.

하나의 OS에서 충돌이 발생하는 이유를 이해할 수 없습니다. 내 장치는 삼성 Nexus S입니다. 어떤 아이디어입니까? 힙 덤프에서 MAT 도구를 실행하고 메인 활동 클래스의 5-6 인스턴스를 유지 된 메모리로 모두 보았습니다. 메모리가 가비지 수집되지 않아야합니까? 이 응용 프로그램은) 풍경 모드로 세로로 전환 에 유지되도록 는, 유증 (20 ~ 25 주위 번) 회전 계속에

답변

5

나는 주요 활동 클래스의 5-6 인스턴스 ... 당신은 활동을 새고

를 참조하십시오. 작업자 스레드가 언제든지 Activities (또는 Contexts 또는 View-derived 유형)에 대한 참조를 유지합니까?

SDK에서 Retaining an Object During a Configuration Change을 강력히 읽어 주시기 바랍니다. 그것은 당신이 바꿀 필요가있는 것을 정확히 알려줍니다.

+0

감사합니다. 난 그냥 안드로이드를 시도 : configChanges = "오리 엔테이션 | keyboardHidden"옵션을 문서에 주어진. 오리엔테이션을 변경 한 후에도 활동의 인스턴스가 하나만 표시됩니다. 가로 모드에 대해 정의 된 특정 레이아웃이 없기 때문에, 내 potrait 모드 레이아웃을 가로로 자동 확장하므로 개발자는 내 응용 프로그램에서 괜찮습니다. – prashant

+0

내 이전 주석에 추가하려면 언젠가는이 옵션에 대해 읽었습니다.하지만 구성 변경시 UI를 다시 가로 모드로 다시 작성해야한다고 생각했습니다. 그래서 더 많은 코드 줄을 추가하는 것에 회의적이었습니다. . 외관상으로는 안드로이드는 액티비티를 죽이지 않지만 정의 된 레이아웃에 따라 화면을 다시 칠하고 구성 요소를 레이아웃합니다. – prashant

1

오류를 재현 할 수있는 방법입니다.

대부분의 경우 화면 방향이 변경 될 때 호출되는 onCreate에 객체를 다시 만들고 있습니다. 결국 이러한 객체를 다시 생성하면 시스템이 압도적으로 커집니다. 다른 메모리 누수가있을 수도 있습니다.