Android 메모리 누 출 원인 및 해결 방법

정확 한 라 이 프 사이클 관 리 는 어떻게 안 드 로 이 드 메모리 누 출 을 방지 합 니까?
OutOf Memory Exception 은 흔히 볼 수 있 는 우울 한 오류 이자 프로그램 이 의외로 닫 히 는 주요 원인 중 하나 이다.
"만약 응용 프로그램 이 어제 잘 실행 되 었 다 면 왜 지금 이런 상황 이 발생 했 을 까?"이 문 제 는 안 드 로 이 드 개발 자 와 초보 자 들 을 곤 혹 스 럽 게 한다.
OutOf Memory 이상 을 초래 하 는 잠재 적 인 원인 은 여러 가지 가 있 지만 그 중에서 가장 흔히 볼 수 있 는 것 은 메모리 누 출-응용 프로그램의 메모리 분배 가 방출 되 지 않 았 다 는 것 이다.본 고 는 효과 적 인 생명 주기 관리(개발 과정 에서 중요 하지만 무시 되 는 부분)를 통 해 이러한 위험 을 최소 화 하 는 방법 을 설명 할 것 이다.
왜 안 드 로 이 드 시스템 에 메모리 누 출 이 발생 합 니까?
문 제 는 간단 하 다.어떤 대상 들 은 수명 이 끝 날 때 삭제 되 어야 한다.

이론 적 으로 프로 세 스 가 onStop 이나 onDestroy 를 사용 하여 종 료 될 때 이 메모 리 를 처리 해 야 합 니 다.그러나 남용 대상 인용 은 쓰레기 수집 기 가 사용 되 지 않 은 대상 을 방출 하 는 것 을 막 을 수 있다.예 를 들 어 사용 하지 않 은 대상 A 가 사용 하지 않 은 대상 B 를 인용 하면 불필요 한 대상 두 개 를 얻 을 수 있 습 니 다.쓰레기 수 거 기 는 서로 인용 하고 있 기 때문에 영원히 방출 되 지 않 습 니 다.
메모리 누 출 을 막 는 흔 한 기술
개발 자 들 은 죽음 을 막 기 위해 많은 절 차 를 밟 을 수 있다.
  • onResume()/onPause()또는 onStart()/onStop()에 방송 수신 기 등록/로그아웃
  • 보기/활동/상하 문 에 정적 변 수 를 사용 하지 마 십시오
  • 문맥 에 대한 인용 을 저장 해 야 하 는 singleton 은 applicationContext()를 사용 하거나 Weak Reference 에 포장 해 야 합 니 다
  • 익명 과 비정 상 내부 류 에 주의 하 십시오.폐쇄 류 에 대한 암시 적 인용 을 포함 하기 때 문 입 니 다
  • 부모 클래스(예 를 들 어 처리 프로그램)보다 더 오래 살 려 면 익명 클래스 가 아 닌 정적 내부 클래스 를 사용 하 십시오
  • 내부 또는 익명 클래스 가 취소 가능 한 경우(예 를 들 어 AsyncTask,Thread,Rxsubscriptions)이 벤트 를 취소 할 때 취소 합 니 다.
  • Android 라 이 프 사이클 감지 구성 요소
    위의 기본 적 인 절 차 를 마치 면 더 중요 한 일 을 할 때 가 되 었 습 니 다.응용 프로그램 활동 의 생명 주기 입 니 다.만약 우리 가 생명 주 기 를 정확하게 관리 하지 못 한다 면,우 리 는 결국 메모리 가 더 이상 필요 하지 않 을 때 그것 을 끊 을 것 이다.
    이것 은 많은 다른 임무 에 관련된다.모든 이벤트 에 대해 저 희 는 스 레 드 를 중단 하고 RxJava 의 구독 을 제거 하 며 AsyncTask 인용 을 취소 하고 이 이벤트 의 인용(그리고 이와 관련 된 모든 활동)을 정확하게 삭제 해 야 합 니 다.이 모든 임 무 는 개발 자의 많은 시간 을 소모 할 것 이다.
    모델 보기 디 스 플레이(MVP)는 일 을 더욱 복잡 하 게 만 들 고 MVP 는 Android 에서 사용자 인터페이스 를 구축 하 는 데 자주 사용 되 는 구조 모델 이다.그러나 MVP 는 보기 에서 업무 논 리 를 분리 하 는 데 유용 하 다.
    MVP 모델 에서 View 와 Presenter 는 모두 그들의 행위 계약 의 추상 적 인 실현 이다.MVP 를 실현 하 는 가장 흔 한 방법 은 이벤트/세 션 을 보기 의 실현 으로 사용 하고 보기 참조 에 익숙 한 시연 자 를 위해 간단 한 실현 을 사용 하 는 것 이다.
    그래서 우 리 는 결국 Presenter 참조 가 있 는 보기 와 보기 참조 가 있 는 Presenter 를 얻 었 다.
    이러한 잠재 적 인 어려움 을 고려 하여,우 리 는 생명주기 에 만들어 진 여분의 메모 리 를 제거 하기 위해 적당 한 관리 구 조 를 세 울 필요 가 있다.몇 가지 효과 적 인 방법 으로 이 점 을 할 수 있다.
    1.Android Studio 에서 Android Arch Lifecycle 을 사용 하여 라 이 프 사이클 을 지원 하 는 구성 요 소 를 만 듭 니 다.
    라 이 프 사이클 감지 구성 요 소 는 지능 적 이다.예 를 들 어 메모리 제 거 를 통 해 다른 구성 요소(예 를 들 어 활동 이나 세 션)의 수명 주기 상태 변경 에 반응 할 수 있 습 니 다.이것 은 코드 가 더욱 가 볍 고 메모리 효율 이 높다 는 것 을 의미한다.
    archlifecycle 는 Android 의 새 라 이브 러 리 로 수명 주 기 를 지원 하 는 구성 요 소 를 구축 하 는 도 구 를 제공 합 니 다.라 이브 러 리 는 추상 적 인 방식 으로 일 하 는데 이것 은 생명주기 소유자 가 특정 임무 와 활동 을 관리 하 는 생명주기 에 대해 더 이상 걱정 할 필요 가 없다 는 것 을 의미한다.
    Arch 라 이 프 사이클 의 핵심 도구 와 정 의 는 다음 과 같 습 니 다.
    4.567917.라 이 프 사이클:정렬 시스템 은 어떤 대상 이 안 드 로 이 드 라 이 프 사이클 을 가지 고 있 는 지 정의 하고 감 시 를 허용 합 니 다
  • LifecycleObserver:일반적인 인터페이스 로 모든 안 드 로 이 드 수명 주기 로 표 시 된 대상 을 감시 하고 간단 한 공식 으로 모든 키 수명 주기 사건 을 처리 합 니 다
  • @OnLifecycleEvent:LifecycleObserver 인 터 페 이 스 를 실현 하 는 클래스 에서 사용 할 수 있 는 주석 입 니 다.이것 은 우리 가 관건 적 인 생명주기 이 벤트 를 설정 할 수 있 도록 합 니 다.이 이벤트 들 은 시작 할 때마다 주석 을 달 수 있 는 방법 입 니 다.다음은 설정 가능 한 모든 이벤트 의 목록 입 니 다:ONANY、ON_CREATE、ON_DESTROY、ON_PAUSE、ON_RESUME、ON_START、ON_STOP
  • LifecycleOwner 는 기본적으로 모든 생명 주 기 를 관리 할 수 있 는 안 드 로 이 드 구성 요 소 를 실현 하고 개발 자 에 게 모든 사건 을 제어 하도록 합 니 다
  • 이 도 구 를 사용 하면 모든 깨끗 한 작업 을 소유자 에 게 보 낼 수 있 습 니 다.
    다음은 아주 기본 적 인 실현 입 니 다.우리 가 말 한 것 을 보 여 드 리 겠 습 니 다.
    
    interface View: MVPView, LifecycleOwner
    
    class RandomPresenter : Presenter<View>, LifecycleObserver {
     private lateinit var view: View
     override fun attachView(view: View) {
      this.view = view
      view.lifecycle.addObserver(this)
     }
    
     @OnLifecycleEvent(Lifecycle.Event.On_DESTROY)
     fun onClear() {
    	//TODO: clean 
    }
    2.시연 자 와 LiveData 로 Android 구조 보기 모델 사용
    또 다른 방법 은 보기 모델 의 메모리 누 출 을 피하 기 위해 새로운 생명주기 구성 요 소 를 사용 하 는 것 이다.
    ViewModel 은 추상 적 인 클래스 로 onClear 라 는 함 수 를 실현 합 니 다.특정한 대상 을 삭제 해 야 할 때 이 함 수 는 자동 으로 호출 됩 니 다.ViewModel 은 프레임 워 크 에 의 해 생 성 되 었 습 니 다.창조 자의 생명 주기 에 추가 되 었 습 니 다.(추가 적 인 장점 으로 Dagger 를 사용 하여 주입 하 는 것 이 매우 쉽 습 니 다)
    뷰 모델 을 사용 하 는 것 외 에 라 이브 데 이 터 는 중요 한 통신 채널 도 제공 했다.이것 은 쉽게 관찰 할 수 있 는 반응 성 산물 을 만 들 었 다 는 것 을 의미한다.
    여기 서 가장 중요 한 것 은 라 이 프 사이클 소유자 가 LiveData 를 관찰 할 수 있 기 때문에 데이터 전송 은 항상 라 이 프 사이클 에 의 해 관리 되 고 사용 할 때 어떠한 인용 도 유지 할 수 있 도록 확보 할 수 있다 는 것 이다.
    3.LeakCanary 와 Bugfender 사용

    상기 절 차 를 제외 하고 우 리 는 두 가지 중요 한 공구 꾸러미 를 추천 하고 싶 습 니 다.LeakCanary,누설 을 감시 하 는 유행 도구,그리고 우리 자신의 Bugfender.
    LeakCanary 는 Android 와 자바 에 사용 되 는 메모리 검사 라 이브 러 리 입 니 다.그것 은 개원 적 인 것 이기 때문에 거대 한 지역 사회 가 그것 을 지원 한다.그것 은 너 에 게 구멍 을 알려 줄 뿐만 아니 라 가능 한 원인 도 알려 준다.
    원 격 로그 도구 Bugfender 는 단일 누 출 추적 을 디 버 깅 하고 DisplayLeakService 라 는 종 류 를 확장 할 수 있 습 니 다.언제 누 출 되 는 지 알 수 있 습 니 다.그리고 우 리 는 Bugfender 로 쉽게 로그 인 할 수 있 습 니 다.
    
    public class LeakUploadService extends DisplayLeakService {
     override fun afterDefaultHandling(heapDump: HeapDump, result: AnalysisResult, leakInfo: String) {
      if (result.leakFound) {
       Bugfender.d(“LeakCanary”, result.toString())
      }
     }
    }
    또한 사용 자 는 전 천후 기록 로그(장치 가 오프라인 되 더 라 도),내 장 된 고장 보고서 와 사용 하기 쉬 운 웹 콘 솔 을 포함 하여 Bugfender 의 모든 장점 을 얻 을 수 있 습 니 다.
    이상 은 안 드 로 이 드 메모리 누 출 의 원인 및 해결 기법 에 대한 상세 한 내용 입 니 다.안 드 로 이 드 메모리 누 출 에 관 한 자 료 는 다른 관련 글 을 주목 하 세 요!

    좋은 웹페이지 즐겨찾기