2017-03-20 4 views
0

안드로이드 애플 리케이션에서 메모리 누출/처리 메모리 누수에 대한 많은 논의가 있지만 동적으로 처리 할 수 ​​있다는 것을 알고 있습니다.동적으로 메모리 누수 처리

방금 ​​인터뷰에서이 질문을 받았습니다. 질문이

응용 프로그램이 사용자 장치에서 실행 중일 때 메모리 누수를 감지하고 충돌 (OutOfMemoryError) 전에 데이터를 저장하는 방법.

모든 활동에 대해 하나의 BaseActivity를 만들고 onStop()에 데이터를 저장하는 것처럼 BaseActivity까지 추측 할 수 있습니다.

또한 BaseActivity에서 Error 클래스를 확장하는 것으로 추측 할 수 있지만 불행히도 Java는 다중 상속을 지원하지 않으며 Error 클래스의 특정 메소드가 동적으로 AFAIK 오류를 감지하지 않습니다.

위의 경우에 잘못되었을 수 있습니다.

다른 방법이 있습니까?

답변

1

나는 Leakcanary와 같은 접근법을 사용했을 것입니다. 당신은 그것에 대해 here 읽을 수 있습니다.

즉, 개체간에 약한 참조가 생성됩니다. GC 후에 그들은 참조가 지워지고 있는지 확인하고 있습니다. 그렇지 않으면 그들은 덤프를 버리고 덤프를 분석합니다. 분석기는 GC Roots에 대한 가장 짧은 강력한 참조 경로를 계산하여 누출이 있는지를 확인한 다음 누수를 일으키는 참조 체인을 만듭니다. 그 순간에 누출이 있으면 필요한 모든 데이터를 저장할 수 있습니다.

모든 데이터를 저장하려면 주 스레드에서이 작업을 수행해야합니다. 그렇지 않으면 응용 프로그램을 닫을 수 있고 데이터가 손실 될 수 있습니다.

+0

정말 좋은 기술입니다. 하지만 약 해지면 누출 여부를 판단하는 데 도움이 될까요? – Ranjit

+1

누수 발견에 도움이되지 않아 새로운 것을 만들지 않도록 도와줍니다. 개체에 대한 약한 참조가 있으면 해당 개체가 GC에 의해 제거됩니다. 따라서 이것이 객체를 추적하고 객체의 가비지 콜렉션을 방해하지 않는 유일한 안전한 방법입니다. 어떤 개체가 유출되었는지 확인하려면 해당 개체의 수명주기를 추적해야합니다. 예를 들어,'onDestroy()'가 Activity에서 호출되면, 그 활동이 메모리에 유지 될 이유가 없습니다. 따라서 어떤 개체에서 해당 활동에 대한 강력한 참조가 있으면 해당 개체가 메모리를 누수하고 있습니다. –

+1

설명해 주셔서 감사합니다. :) – Ranjit