2016-07-04 3 views
0

다음과 같은 클래스 구조가 있습니다.Android 앱에서 메모리 누수가 발생했습니다.

class A 
    { 
     B b; 

     A() 
     { 
      b = new B(); 
      b.a = this; 
     } 
    } 

    class B 
    { 
     A a; 
    } 

    class C 
    { 
     A a = new A(); 

     //a is ready for Garbage collection 
     a = null; 
    } 

활동 파기(), I는 변수 a = NULL을 설정한다. 하지만 힙에서 여전히 변수 b가 B에 대한 참조를 보유하고 있음을 알 수 있습니다.

누구든지 설명 할 수 있습니까?

+0

아마도 아직 수집되지 않았을 수 있습니다. gc 강제로 시도한? – Memme

+0

@ Memme gc 강제로 나쁜 생각입니다! 메모리 누출을 멈추고 시도하지 말아야합니다. 물론 – apmartin1991

+0

@ apmartin1991. 그러나 나는 단지 그것을 확인했을 것입니다. 어쨌든 당신이 C로 새로운 객체를 인스턴스화하고 그것을 null에 두는 것은 그 특정 인스턴스만을 수집 할 것입니다. 하지만 내가 틀릴 수도 :) – Memme

답변

1

Java에서 정적이 아닌 내부 및 익명 클래스는 외부 클래스에 대한 암시적인 참조를 보유합니다. 정적 인 내부 클래스는 다른 핸드에 있지 않습니다.

그래서 예를 들어 당신이 쓰레기 수집 및 모두에게 응용 프로그램의 자원을 누출 활동 상황을 방지 할 수 클래스 B 또는 C에 장기 실행 작업을 수행하는 경우.

Here is a great post about memory leaking on Android with static inner classes, written by Alex Lockwood

또 다른 잠재적 인 이유는 정확하게 배경 스레드를 처리하지 않으며이 여전히 실행 또는 미래의 실행을 위해 예약 된 것을 할 수 있습니다. Alex Lockwood가 다음 글을 작성한대로 this post :

Java가 실행 스레드를 정리할 것이라고 가정하지 마십시오.

마지막으로 메모리 누출 감지를위한 훌륭한 도구 인 leakcanary을 통합 할 수 있습니다. 어떤 객체가 참조를 보유하고 가비지 수집을 방지하는지 그래프로 보여줍니다.

+0

사실이 코드에는 내부 클래스 나 중첩 클래스가 없습니다. – maciekjanusz