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

OutOfMemoryError에 대해서 여쭤볼게 있어요..

0 추천

https://github.com/tmarzeion/drawable-notepad

위에서 소스코드를 다운받아서 적용시키려고하는데 노트패드를 몇개 만들면 

============================================

D/OpenGLRenderer: endAllStagingAnimators on 0xdcb7fb00 (RippleDrawable) with handle 0xe10a3f90
I/art: Background sticky concurrent mark sweep GC freed 128(13KB) AllocSpace objects, 3(53KB) LOS objects, 0% free, 227MB/227MB, paused 7.058ms total 8.749ms
I/art: Clamp target GC heap from 256MB to 256MB
I/art: Clamp target GC heap from 268MB to 256MB
I/art: Alloc partial concurrent mark sweep GC freed 10(320B) AllocSpace objects, 1(18KB) LOS objects, 1% free, 252MB/256MB, paused 397us total 5.502ms
I/art: Clamp target GC heap from 268MB to 256MB
I/art: Alloc concurrent mark sweep GC freed 6(12KB) AllocSpace objects, 0(0B) LOS objects, 1% free, 252MB/256MB, paused 290us total 6.921ms
I/art: Forcing collection of SoftReferences for 12MB allocation
I/art: Clamp target GC heap from 268MB to 256MB
I/art: Alloc concurrent mark sweep GC freed 11(344B) AllocSpace objects, 0(0B) LOS objects, 1% free, 252MB/256MB, paused 397us total 7.504ms
E/art: Throwing OutOfMemoryError "Failed to allocate a 12879372 byte allocation with 3871833 free bytes and 3MB until OOM"
D/skia: --- decoder->decode returned false
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.briswell.mycalendar, PID: 8384
                  java.lang.OutOfMemoryError: Failed to allocate a 12879372 byte allocation with 3871833 free bytes and 3MB until OOM
                      at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
                      at android.graphics.BitmapFactory.nativeDecodeByteArray(Native Method)
                      at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:522)
                      at android.graphics.BitmapFactory.decodeByteArray(BitmapFactory.java:545)
                      at com.briswell.mycalendar.diary.BitmapConverter.getImage(BitmapConverter.java:23)
                      at com.briswell.mycalendar.diary.DatabaseHandler.getAllNotesAsArrayList(DatabaseHandler.java:213)
                      at com.briswell.mycalendar.diary.SaveOrUpdateNoteTask.updateNoteListView(SaveOrUpdateNoteTask.java:65)
                      at com.briswell.mycalendar.diary.SaveOrUpdateNoteTask.onPostExecute(SaveOrUpdateNoteTask.java:59)
                      at com.briswell.mycalendar.diary.SaveOrUpdateNoteTask.onPostExecute(SaveOrUpdateNoteTask.java:13)
                      at android.os.AsyncTask.finish(AsyncTask.java:632)
                      at android.os.AsyncTask.access$600(AsyncTask.java:177)
                      at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
                      at android.os.Handler.dispatchMessage(Handler.java:102)
                      at android.os.Looper.loop(Looper.java:135)
                      at android.app.ActivityThread.main(ActivityThread.java:5221)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at java.lang.reflect.Method.invoke(Method.java:372)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

=============================================

위와같은 에러가 뜹니다. stackoverflow.com 등 구글링을 몇일동안 해본결과 dalvik 영역의 heap쪽이 꽉 차서 그렇다고 그런다는데, DataBaseHandler에서 빠진 db.close();, cursor.close()를 다 추가하고

DrawingView class에서 

public DrawingView(Context context, AttributeSet attrs){
      super(context, attrs);
      setupDrawing();
      doRecycle();
}
public void doRecycle(){
    if(canvasBitmap != null) {
        canvasBitmap.recycle();
        canvasBitmap = null;
        System.gc();
    }
}

이런 내용도 추가했는데 별다른 성과가 없더군요.. 어떤방식으로 해결해야할까요?

manifest쪽에 이미 android:largeheap="true"를 해둔 상태로 heap공간도 일단 넓혀놔서 노트를 조금 더 만들순 있는데 근본적으로 해결이 안됩니다..

비트맵을 만든 순간 softreference나 weakreference를 적용시키는게 하나의 방법이라고 검색을 통해 알게되었는데 이를 적용하는방법을 여태 찾지 못해서 질문한번 올려봅니다. 

혹여나 방법을 알고 계신분은 다는 알려주시지 못해도 힌트라도 좀 알고싶습니다. 

 

아니면 clamp target gc heap이라는걸 매번 비우면 될것같은데 이를 비울 수 있는 방법이 있나요?

읽어주셔서 감사합니다.

ps. 안드로이드펍에선 질문 검색을 할 수 없나요?

과거 질문에 대해서 검색하는 것을 찾질 못하겠어요. (구)질문게시판에서는 가능하지만..

비에스나 (220 포인트) 님이 2016년 11월 2일 질문
비에스나님이 2016년 11월 2일 수정

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...