안드로이드 개발 메모리 최적화 (1)

1) OOM 분석

우선 Android 시스템이 각 애플리케이션에 대해 Dalvik 가상 머신 인스턴스를 생성 한 다음 프로세스를 생성 한 다음 메인 스레드를 생성하여 애플리케이션을 형성한다는 것을 이해해야합니다. 그런 다음 가상 머신을 생성하면 각 가상 머신에 대한 메모리 DalvikHeap 크기 할당을 고려합니다. 성능이 다른 휴대폰의 메모리 크기는 다릅니다. 초기에는 일부 머신이 16M을 할당하고 일부는 24M을 할당했습니다. 물론 DalvikHeap 크기는 최대 임계 값 (사용 가능)이있는 간격입니다. adb 명령은 할당 된 최대 메모리를 확인하는 데 사용됩니다 : adbshell getprop dalvik.vm.heapsize) 응용 프로그램이 차지하는 메모리가이 임계 값을 초과하면 OutOfMemoryError (일반적으로 OOM이라고 함)가 발생합니다. OOM은 주로 응용 프로그램 메모리 응용 프로그램이 점점 더 축적되고 gc 미래 및 재활용이 최대 힙 크기 임계 값을 초과하기 때문에 나타납니다.

주로 다음과 같은 상황이 있습니다.

1.로드 된 이미지 개체가 너무 큽니다.

2. 리소스가 너무 많아로드하기에 너무 늦습니다.

3. 많은 메모리 누수가 해제되지 않았습니다.

OOM을 방지하기위한 일반적인 솔루션 :

1. 이미지를로드 할 때 이미지가 너무 크면 압축에 맞게 이미지 크기를 조정하십시오.

2. 이미지는 낮은 메모리 인코딩 방법을 사용합니다. Bitmap.Config.ARGB_4444;

3. 레벨 2 캐시를 사용하여 네트워크 이미지를로드합니다. 일반적으로 타사에서 이미 패키지화했습니다.

4. 많은 수의 로컬 이미지 메모리 참조가 소프트 참조를 사용합니다.

5. Listview의 Adapter는 getView ()에 전달 된 캐시 convertView를 재사용하여 반복적 인 팽창을 방지하고 ViewHolder 모드를 사용하여 메모리 소비를 줄이기 위해 findViewById에 대한 불필요한 호출을 방지합니다.

6. 메모리 누수를 피하십시오 (메모리 누수는 대부분 자세한 소개를 위해 아래에 있습니다).

7. 힙 메모리 할당 크기를 사용자 지정하고 Dalvik 가상 머신의 힙 메모리 할당을 최적화합니다.

2) 메모리 누수 분석

JAVA 가비지 수집 (가비지 수집, 줄여서 GC)은 힙 메모리 복구를 처리하지만 개체가 참조되어 복구 할 수없는 경우 메모리를 낭비하고 더 이상 사용할 수 없어 메모리 누수가 발생합니다.

일반적인 메모리 누수 :

1. 싱글 톤으로 인한 메모리 누수는 주로 Activity와 Service의 Context가 멤버 변수로 전달되어 메모리 누수를 유발하기 때문에 발생하며, context.getApplicationContext ()를 사용하여 메모리 누수를 해결할 수 있습니다.

2. 활동의 비 정적 내부 및 익명 클래스는 모두 활동 참조를 보유하므로 쉽게 메모리 누수가 발생할 수 있습니다. 일반적인 핸들러 내부 클래스는 활동 참조를 보유합니다. 정적 내부 클래스 소프트 참조를 사용하여 내부 클래스를 활동으로 역 참조 할 수 있습니다. 메모리 누수를 해결하기 위해;

3. Bitmap을 사용한 후에 Recycle ()이 호출되지 않아 메모리 누수가 발생합니다. 마지막에 recycle ()을 추가하여 해결할 수 있습니다.

4. 데이터베이스의 커서가 닫히지 않고 끝에서 닫아서 해결할 수 있습니다.

5. 레지스터를 호출하여 등록을 해제해도 바인딩이 해제되지 않습니다. 종료 후 해제하려면 unregister를 호출하여 해결할 수 있습니다.

6. 소켓과 IO가 닫히지 않은 경우 종료 후 닫으면 해결할 수 있습니다.

7. Webview는 종료 후에도 파기되지 않으며 종료 후 파기하여 해결할 수 있습니다.

mWebViewContainer.removeView(mWebView);
mWebView.stopLoading(); 
mWebView.getSettings().setJavaScriptEnabled(false);
mWebView.clearHistory();
mWebView.removeAllViews(); 
mWebView.destroy();



추천

출처blog.csdn.net/xhf_123/article/details/78989396