2012-01-25 5 views
1

Android 앱에서 메모리 누수가 많이 발생했습니다. 나는 고정 비트 맵을 가지고 있지 않다. (이는 Bitamps 유출에 관한 모든 자습서에서하지 말라고 말한 것이다.) 그러나, 내 활동의 무리에 의해 사용되는 내 응용 프로그램 클래스에 저장 해요 비트 맵 있습니다. 내가 그 때 recycle() 마지막 활동이 종료 될 때 전화 오전,하지만 그냥 byte[] 같이 데이터를 저장하고 그것을 사용하는 각 활동에서 로컬로 Bitamp 만드는 안전한 것이라고 궁금하네요 그리고 그것을 출시 할 곧 끝납니다. 내가 궁금한 건 byte[]은 VM이 비트 맵보다 가비지 수집이 쉽다는 구조이다.Bitmap과 달리 byte []가 가비지 수집됩니까? 아니면 똑같습니까?

모든 도움은 대단히 감사하겠습니다.

+0

데이터의 출처는 어디입니까? 네트워크입니까? 왜 그것을 메모리에 저장해야합니까? – aromero

+0

aromero, 데이터는 카메라 및 이미지 리소스에서 가져옵니다. 나는 재고 이미지를 사용하고 사람들이 찍은 사진의 새겨 져있는 부분을 겹쳐서 사용하고 있습니다. 그래서 저는 메모리에있는 두 요소를 읽고 처리 할 수 ​​밖에 없습니다. –

답변

1

Bitmap에서 byte[]으로 변경하면 Bitmap 개체에 대한 참조를 유지함으로써 발생하는 문제를 해결할 수 없습니다. recycle()을 호출하는 대신 마지막 활동이 종료 될 때 null 참조를 설정해야합니다. 그러면 recycle()을 호출하면 GC가 Bitmap 개체 자체를 수집 할 수있게됩니다. (이 재활용에 올 때 GC는 Bitmapbyte[] 구분하지 않습니다. 참조되지 않은 객체가 참조되지 않은 객체이다 ...)

유일한 다른 점을 Bitmap이 정말 메모리 누수의 원인 인 경우 (제안) 하드 참조 대신 응용 프로그램 클래스에서 WeakReference<Bitmap>을 사용하는 것입니다. 그런 다음 각 활동은 실제 Bitmap 일 수 있습니다 (아직있을 경우). 그렇다면 null으로 설정할 필요가 없습니다. GC는 하드 참조가 없을 때 Bitmap을 자동으로 수집하여 빈 약한 참조를 남깁니다.

+0

매우 흥미 롭습니다! 그리고 당연히 나는 null에 대한 참조를 설정하는 것을 괴롭히지 않는 바보 같은 사람이다. recycle()이 나를 위해 그것을 처리한다고 생각한다. (왜 그런 것일까? 절대적으로해야한다! :) ... 대단히 고마워, 나는이 모든 것을 소용돌이 칠 것이다. –

+1

비트 맵은 기본적으로 처리되므로 recycle()을 호출하면 비트 맵이 보유하는 대부분의 메모리를 처리 할 수 ​​있다고 생각합니다. 따라서 reference를 null로 설정해도 recycle()을 호출하는 것과는 큰 차이가 없습니다. 특별히 하나의 객체 만 말하면됩니다. – aromero

+0

@aromero - 맞아. 이것이 바로이 비트 맵이 메모리 누수의 원인이라는 의심을 표명 한 이유입니다. –

0

카메라에서 가져온 비트 맵을 처리하는 경우 이 필요합니다. 이미지의 크기에는 매우주의해야합니다.

카메라로 찍은 사진은 꽤 클 수 있습니다. 이미지를 비트 맵으로 열면 전체 배열이 메모리로로드됩니다. 5MP 카메라가 장착 된 Nexus One을 고려해보십시오. 기기로 촬영 한 사용자 사진은 2048x1536만큼 클 수 있습니다. 24 비트 픽셀 깊이를 사용하여 약 9MB에 대해 이야기하고 있습니다. 이것은 거대한인데 16/24 MB 힙 한계를 고려한 경우입니다.

솔루션 장치가 훨씬 낮은 해상도를 가질 것이기 때문에 일반적으로 전체 크기의 이미지가 필요하지 않습니다, 작은 크기와 함께 작업하는 것입니다, 플러스 ImageView의 크기 (또는 다른면 당신은 비트 맵을 표시하는 데 사용할) 일반적으로 모든 화면을 차지하지 않습니다.

BitmapFactory.decodeByteArray(...) (및 기타 공장 방법)은 을 통해 축척 비율을 지정할 수있는 BitmapFactory.Options 개체를 사용할 수 있습니다. 이렇게하면 원본 데이터에 영향을 미치지 않으므로 전체 크기 이미지를 유지하고 샘플 비트 맵을 메모리에 저장할 수 있습니다. 이전에 inJustDecodeBounds = true을 사용하여 이미지 크기를 읽은 다음 이미지의 크기와 뷰포트의 크기에 따라 배율을 계산하고 마지막으로 배율 조정 된 비트 맵을 얻으십시오.

이 질문은 (하지 선택한 대답하지만, 높은 점수와 다른 두) 편리 할 수 ​​있습니다 Strange out of memory issue while loading an image to a Bitmap object

편집 : 죄송합니다, 나는이 질문에 이미 대답했습니다 알고

0

에 의문을 잘못된 링크를 게시 사이드 노트와 마찬가지로 : Bitamps를 다루는 경우, Android가 기본적으로 처리하는 것 중 하나입니다 (즉, Java 코드가 아닌 C 코드를 통해). 따라서 모든 참조를 해제하더라도 네이티브 측의 메모리에 여전히 저장되며 앱과 비교됩니다.

+0

이것은 이전 Android 버전 – Janusz

+0

에만 해당합니다. 그 이유는 2012 년에 그렇게 대답했기 때문입니다. – StackOverflowed

관련 문제