데이터에서 신호 처리를 수행하면서 녹음 된 파일을 재생할 수있는 Android 앱을 작성 중입니다.Android : OutOfMemory 활동을 다시 여는 앱의 예외
파일이 목록보기에서 선택되면 재생 및 처리가 이루어지는 새 활동이 실행됩니다. onBackPressed 메서드에서 필자는 finish를 호출하여 작업을 끝내고 사용자가 다른 파일을 선택할 수있는 목록보기로 돌아갑니다.
작은 파일을 여러 번 선택하거나 큰 파일을 한 번만 선택하면 모두 잘 작동하지만 큰 파일을 다시 선택하면 OutOfMemoryError 예외가 발생합니다.
나는 메모리 힙을보기 위해 DDMS를 사용했으며 목록보기로 돌아갈 때 활동의 메모리가 해제되지 않는다는 것이 분명합니다. 로드되는 파일의 크기에 따라 누적됩니다.
많은 연구에도 불구하고 메모리 누수가 어디서 발생하는지 잘 모릅니다. 나는 비트 맵과 컨텍스트 참조를 원인으로 들여다 보았지만 문제는 아닌 것으로 보인다. 마이크에서 얻은 실시간 오디오를 사용하는 비슷한 활동이 있기 때문에 파일로드 자체가 문제가되지는 않습니다.
1) 메모리 누수의 원인은 무엇입니까?
2) finish/ondestroy가 호출 될 때 활동의 메모리가 해제되는지 어떻게 확인합니까?
작업을 마치면 명시 적으로 파일을 닫으시겠습니까? –
예, 파일을 닫습니다 (파일 자체가 문제가 아님). 나는 내가하는 모든 작업이 새로운 작업을로드하고 많은 데이터 (float 500 만 개 요소)로 채우는 간단한 테스트 응용 프로그램을 만들었습니다. OnBackPressed 나는 마무리를 부른다. 이것 역시 메모리 부족 예외를 일으키고, system.gc를 호출하면이 경우 문제가 해결됩니다. 그러나 내 실제 응용 프로그램에서 system.gc 같은 효과가없는 것 같습니다. system.gc는 지침이 아니라 제안입니다. – user2819360
파일/db/ports 등을 닫지 않고 작업을 완료했습니다. 작업을 위해 열었습니다. –