0

내 응용 프로그램에서 메모리를 최적화해야합니다. 프래그먼트가 닫히면 해당 프래그먼트가 사용하는 메모리를 비워야합니다.자유 조각 메모리

그럼 자유 최대 메모리

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    txt_legal_1 = null; 
    txt_legal_2 = null; 
    progressBar = null; 
    mHandler = null; 
    prefs = null; 
    content = null; 
    System.runFinalization(); 
    Runtime.getRuntime().gc(); 
    System.gc(); 
} 

을 다음 단계를하고있는 중이 야하지만 여전히 메모리는 자유 일어 났어 여기에 대한-하나 도움이되지인가?

+0

당신의 조각에서 모든 필드를 비공개로, 당신을 위해 트릭을 할 것입니다 –

답변

0

활동 코드를 살펴보면, 뭔가가 단편을 참조하거나 그 중 하나가 필드에 해당한다고 생각합니다. 적어도 하나의 링크가 지속되면 Java Garbage Cleaner가 메모리에서 오브젝트를 정리할 수 없습니다. (일부 리스너, 수신기 등일 수도 있음)

또한 실행중인 System.gc()가 메모리, 사실 당신은 단지 시스템을 암시하여 정리를 수행합니다. GC가 Android Studio의 '모니터'탭에서 성공적으로 완료되는지 확인할 수 있습니다. "GC 시작"버튼이 있습니다. GC가 실제로 시작됩니다. 그리고 메모리 소비량이 변하지 않는다는 것을 알게된다면, 그것은 당신이 뭔가 잘못한 것을 의미 할 것이고, 무엇인가 여전히 Fragment (또는 그 필드) 링크를 유지할 것입니다.

0

Leak Canary을 사용해보십시오.

메모리 누수를 감지하고 수정하는 데 도움이됩니다.

0

이 시도 : 당신의 조각에

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    removeListeners(); //remove any listener.. 
    try { 
     getActivity().unregisterReceiver(receiver); //unregister any receiver that you register in fragment 
     unbindDrawables(rootView.findViewById(R.id.coordinator)); //R.id.coordinator is the root layout of your fragment view 
     System.gc(); 
    } catch (Exception e) { 

    } 
} 


//free up any drawables..views 
private void unbindDrawables(View view) { 
    if (view.getBackground() != null) { 
     view.getBackground().setCallback(null); 
    } 
    if (view instanceof ViewGroup) { 
     for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { 
      unbindDrawables(((ViewGroup) view).getChildAt(i)); 
     } 
     if (!(view instanceof AdapterView<?>)) 
      ((ViewGroup) view).removeAllViews(); 
    } 
}