2013-10-10 4 views
1

데이터에서 신호 처리를 수행하면서 녹음 된 파일을 재생할 수있는 Android 앱을 작성 중입니다.Android : OutOfMemory 활동을 다시 여는 앱의 예외

파일이 목록보기에서 선택되면 재생 및 처리가 이루어지는 새 활동이 실행됩니다. onBackPressed 메서드에서 필자는 finish를 호출하여 작업을 끝내고 사용자가 다른 파일을 선택할 수있는 목록보기로 돌아갑니다.

작은 파일을 여러 번 선택하거나 큰 파일을 한 번만 선택하면 모두 잘 작동하지만 큰 파일을 다시 선택하면 OutOfMemoryError 예외가 발생합니다.

나는 메모리 힙을보기 위해 DDMS를 사용했으며 목록보기로 돌아갈 때 활동의 메모리가 해제되지 않는다는 것이 분명합니다. 로드되는 파일의 크기에 따라 누적됩니다.

많은 연구에도 불구하고 메모리 누수가 어디서 발생하는지 잘 모릅니다. 나는 비트 맵과 컨텍스트 참조를 원인으로 들여다 보았지만 문제는 아닌 것으로 보인다. 마이크에서 얻은 실시간 오디오를 사용하는 비슷한 활동이 있기 때문에 파일로드 자체가 문제가되지는 않습니다.

1) 메모리 누수의 원인은 무엇입니까?

2) finish/ondestroy가 호출 될 때 활동의 메모리가 해제되는지 어떻게 확인합니까?

+0

작업을 마치면 명시 적으로 파일을 닫으시겠습니까? –

+0

예, 파일을 닫습니다 (파일 자체가 문제가 아님). 나는 내가하는 모든 작업이 새로운 작업을로드하고 많은 데이터 (float 500 만 개 요소)로 채우는 간단한 테스트 응용 프로그램을 만들었습니다. OnBackPressed 나는 마무리를 부른다. 이것 역시 메모리 부족 예외를 일으키고, system.gc를 호출하면이 경우 문제가 해결됩니다. 그러나 내 실제 응용 프로그램에서 system.gc 같은 효과가없는 것 같습니다. system.gc는 지침이 아니라 제안입니다. – user2819360

+0

파일/db/ports 등을 닫지 않고 작업을 완료했습니다. 작업을 위해 열었습니다. –

답변

0

대용량 데이터 청크에 'WeakReference'구성 요소를 첨부 할 수 있습니다. 이렇게하면 필요할 때 보유한 오래된 연관된 메모리 청크가 해제됩니다. 따라서 다른 파일이 메모리를 가져 오거나 요청한 후에는 이전의 'WeakReference'청크를 해제하고 메모리 문제를 그런 방식으로 해결해야합니다. 이것은 지정된 시간 동안 만 파일을 필요로하는 것처럼 보이기 때문에이 방법을 사용해야합니다.이 접근법을 사용하면 걱정할 필요없이 시스템에서 언제 릴리스할지 걱정할 수 있습니다.

+0

고마워, 그냥 해봤 어. 불행히도 문제를 해결하지 못하는 것 같습니다. – user2819360

+0

대용량 메모리 청크에 약한 참조 만 할당했다면 파일의 메모리가 문제가 아님을 나타냅니다. 실수로 문맥이 누출되거나 문제를 일으키는 재귀 적 특성이있을 수 있습니다. 스택 추적 및/또는 코드를 게시해야합니다. –