2016-07-29 1 views
2

잠재적 인 중복 될 수 있지만 내 문제에 대한 apropriate 대답을 찾을 수없는 경우 미안 해요. 그래서 좋은 자료를 참고할 수 있다면, 내가보기에 더 기쁠 것입니다.안드로이드 미묘한 메모리 누수 분석 MAT

여기에 문제가 있습니다. 저는 앱을 실행하는 동안 미세한 메모리 누수를 관찰했습니다. 따라서 16 시간 동안 실행 한 후에 힙 덤프는 Eclipse Memory Analyzer를 통해 실행되며 메모리 누수가 의심 스러울 때 많은 쓰레드가 쓰레기 수집되지 않는다고 제안합니다. 힙은 약 16 시간 후에 3MB 증가합니다. - 왼쪽 패널은 5 분 동안 응용 프로그램을 실행 한 후, 그리고 오른쪽 패널 (16) 이후

private WorkerThread mWorkerThread; 

private static Runnable mUploadTask = new Runnable() { 
     @Override 
     public void run() { 
      Object[] data = dataQueue.poll(); 
      if(data != null) { 
        uploadPacketviaAMQP((String)data[0], (String)data[1]); 
     } 
    }; 

    private static class WorkerThread extends HandlerThread{ 

    private Handler mWorkerHandler; 

    public WorkerThread(String name) { 
     super(name); 
    } 

    public void postTask(Runnable task){ 
     mWorkerHandler.post(task); 
    } 

    public void prepareHandler(){ 
     mWorkerHandler = new Handler(getLooper()); 
    } 
} 

그래서 여기가 MAT 화면 잡고 있습니다 : 여기

내가 다시 땅에 작업을 실행하는 데 사용되는 코드입니다 시간. 참조가 재귀적이고 이리저리 뛰어 오르며 어떤 구체적인 대상으로 이어지지 않기 때문에 그것은 나에게 어떤 의미가 없습니다.

MAT output

는이 문제를 어떻게 디버깅에 대해 가야하나요?

감사합니다.

답변

0

Leakcanary을 사용해 볼 수 있습니다. 메모리 누수를 탐지하는 것은 실제로 정확합니다. Logcat에서 누수 추적을 표시하고 최근 누출 기록을 유지하는 추가 활동을 응용 프로그램에 연결합니다. 덤프 힙을 파지 않고 코드에서 가능한 메모리 누수 위치를 찾는 데 도움이됩니다.