2014-02-24 4 views
0

내 질문은 내가 직면하고있는 메모리 누수에 관한 것이지만 (안드로이드 개발), 근본 원인을 찾을 수 없다.메모리 누수 - 다른 클래스의 비트 맵 유형 인스턴스 변수 초기화

나는 두 개의 클래스 -A와 B가 있습니다. 클래스 A는 B-objectB의 오브젝트를 가지고 있습니다. 클래스 B에는 비트 맵 유형의 인스턴스 변수 mTempBitmap이 있습니다. 클래스 A에서 비트 맵 객체 aBitmapObject를 만듭니다 & 초기화 - objectB.mTempBitmap = aBitmapObject. 클래스 B에서 API onDraw()에서 mTempBitmap을 null로 설정했습니다.

이제 키를 누를 때마다 objectB의 mTempBitmap이 업데이트되고 objectB.onDraw가 호출됩니다. 그러나 너무 빠르게 키를 누르면 onDraw()가 호출되지 않습니다.

이 경우 메모리 누수가 발생할 수 있습니다. 힙 덤프를 가져 와서 메모리 분석기 MAT 도구로 분석하면 예상하지 못한 50-60 비트 맵 객체를 찾습니다.

Java의 메모리 누수에 대한 정의가 명확하지 않지만 몇 가지 게시물을 읽었습니다.

위의 상황에서 발생하는 메모리 누수는 onDraw()가 호출되지 않아 objectB.mTempBitmap이 null로 업데이트되지 않기 때문일 수 있습니까 ?? (afaik, objectB.mTempBitmap이 null이 아니더라도 나중에 mTempBitmap이 다른 비트 맵을 가리 키므로 메모리 누수 문제가 없어야합니다.) 어딘가에 비트 맵 복사본이 생성되어 누출되는 이유가 무엇입니까 ?? objectB.mTempBitmap = aBitmap을 초기화 할 때 비트 맵 복사본이 생성 되었습니까? 아니면 다른 비트 맵이 동일한 비트 맵에 첨부됩니까 ?? (afaik, 동일한 비트 맵에 대한 또 다른 참조, 새로운 비트 맵 복사본이 생성되지 않음)

누구나 도움이된다면 도움이됩니다.

답변

1

변수를 null로 설정해도 메모리 할당이 해제되지 않습니다. 메모리는 (비공식적으로) 액세스 할 수있는 방법이 없을 때 자동으로 할당이 해제됩니다. 이렇게하면 :

someField = new Bitmap(...); 
someField = new Bitmap(...); 

는 첫 번째 비트 맵은 null로 아무것도을 설정하지 않은 경우에도 해제 할 수 있습니다. 그런 다음 다시 수행하면

someField = new Bitmap(...); 

두 번째 비트 맵을 할당 취소 할 수 있습니다. 따라서 메모리 누수가 발생하지는 않습니다. 메모리 누수가 발생하면 다른 원인이 있습니다.