마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안녕하세요. 파일 생성중 out of memory가 발생해서 문의 드립니다.

0 추천

안녕하세요. 답답한 마음에 글 남깁니다.

보통 out of memory 관련 글이 전부다 이미지 관련 글이라서.. 글을 남기게 되었습니다.

제가 만드는 어플이 sqlite DB 를 사용 중인데

Asset 용도의 Read기능만 사용합니다.

그래서 Asset폴더에 외부에서 만든 DB파일을 넣어놓고 어플 실행시

databases 폴더에 파일을 복사하는 루틴을 넣어놨습니다.

평소 적은용량은 아무문제가 없었고 1메가도 안하던 DB파일이 어느샌가 30메가정도가 되었습니다.

LG 옵티머스G프로와 G3에서는 아무런 문제도 없었는데

테스트폰으로 구한 갤럭시s3에서 이것저것 테스트 도중에 out of memory를 뱉는것을 확인했습니다.

확인결과 어플 실행후 백그라운드로 어느정도 시간이 지난후 다시 실행했을때 오류가 나는걸 확인하였고

백그라운드로 간 액티비티가 강제종료 이후 다시 액티비티 실행하였을때 문제가 생기나 싶어서

테스트를 개발자옵션에 있는 액티비티 유지 안함 을 체크 해서 액티비티를 종료하면 즉시 메모리를

 

제거하게 했습니다.

byte[] buffer = new byte[size];

이 부분에서 out of memory가 생겼습니다. size는 33메가 정도구요...

물론 옵티머스G프로와 G3는 아무 이상 없구요..

System.gc도 실행해봤지만 안되었습니다..

처음 실행할때 new byte는 아무 이상이 없는데 꼭 액티비티 강제 종료 이후에 다시 첨부터 실행될때

out of memory가 생기네요 ㅠㅠ..

마기 (210 포인트) 님이 2015년 6월 28일 질문

2개의 답변

0 추천
buffer가 어떤 식으로 사용되는지 몰라서 조심스럽긴한데 혹시 백그라운드 갔을때 유지할 필요가 없다면 buffer 를 풀어주시는건 어떤지요?

? = buffer 된 곳을 찾으시고 저 ?들과  buffer 전부 풀어주시는것은 어떻신지요?

? = null;

buffer = null;
컴러기 (22,230 포인트) 님이 2015년 6월 28일 답변
해당 buffer는 FileOutputStream 클래스를 이용해서 파일로 생성합니다.
buffer는 null 해봤지만 여전히 out of memory가 생기네요
0 추천
이게 맞는건진 모르겠는데..

소스를 다시 천천히 보니까 제가 좀 바보같이 만든거같아서 수정하니까

현재까진 제대로 되는거 같습니다.

아무생각없이 buffer를 메모리 할당할때 파일의 사이즈만큼 할당을 했는데

파일이 34메가나 되다 보니 순간 34메가의 메모리를 할당해서 문제가 되는거같았습니다.

그래서 그냥 1메가의 buffer를 메모리 할당하고

총 34번의 루프를 돌면서 파일을 생성하니까 정상적으로 되었습니다.
마기 (210 포인트) 님이 2015년 6월 28일 답변
잘 처리하셨네요.
IO시 사용되는 버퍼도 Heap 메모리를 사용하니까, 기기마다 허용가능한 Heap 사이즈가 안드로이드는 참.. 다양합니다. 가장 최소 사이즈를 감안해서 앱을 구현해야 할 겁니다.
답변 정말 감사드립니다~
...