2017-09-19 8 views
0

내 응용 프로그램의 메모리 소비를 분석하려고했습니다. 그래서 .hprof 파일이 있습니다. 지금 미친 짓은 거의 모든 소프트웨어로 다른 결과를 얻는 것입니다.안드로이드 메모리 분석 - 다른 유지 메모리 결과

필자는 모든 값을 비교 한 샘플 클래스를 사용했습니다. Retained memory를 제외하고는 거의 모든 숫자가 동일합니다.

예. 이클립스 메모리 분석기에서

  • 열기 HPROF : 왼쪽 정보에 984
  • 이클립스 메모리 분석기 : 안드로이드 Studio에서 456
  • 열기 HPROF : 470
  • 읽기 이러한 도구에 유지 메모리에 대한 숫자 Google에서 Perflib을 사용한 HPROF : 568

왜 이러한 도구가 큰 차이점이 있습니까? 비슷한 경험을 가진 사람이 있습니까?

안드로이드 스튜디오 영상 : enter image description here

나는 다음과 같은보기를 얻을 그림자 $의 _klass가 Perflib는 같은 값 (568)을 가지고 볼 수있는 CommunicationManager 클래스의 안드로이드 Studio의 세부 사항을 보면 . 여기를 참조하십시오 :

enter image description here

성능 라이브러리 콘솔 로그 :

Perflib는 출력 내가 전화 할 때 ClassObj에 의해 반환됩니다 수를 보여줍니다 "getTotalRetainedSize()".

enter image description here

이클립스 메모리 분석기 : enter image description here

그러나 이클립스 메모리 Analzyer의 왼쪽에 나는 다음과 같은 볼 수 있습니다 : 내가 발견 알고 enter image description here

답변

0

어떻게 Perflib에서 Android Studio의 값으로 이동할 수 있습니다. 아직도 Eclipse Analyzer가 어떤 역할을하는지 알지 못합니다.

안드로이드 스튜디오에서 값을받을 수 있나요 방법 :

  1. 가 ClassObj (들)
  2. 확인이 ClassObj의 하드 참조를 취득하고 ClassObj와 같은 클래스 모든 하드 참조를 가지고. 해당 인스턴스를 가져 와서 TotalRetainedSize를 계산하고 더 많은 것이 있으면 합산하십시오.
  3. 하드 참조가없는 경우 유지 크기로 얕은 크기를 사용하십시오.

코드 :

for(int i = 0; i < listOfClassObj.size(); i++){ 
    ClassObj clazz = listOfClassObj.get(i); 
    ArrayList<Instance> list = clazz.getHardReferences(); 

    long retainedValue = 0; 

    if(list.size() > 0){ 
     for(int x = 0; x < list.size(); x++){ 
      Instance inst = list.get(x); 
      String instanceStr = inst.toString(); 
      if(instanceStr.substring(0, instanceStr.indexOf("@")).contentEquals(clazz.getClassName())){ 
       retainedValue += inst.getTotalRetainedSize(); 
      } 
     } 
    }else{ 
     retainedValue = clazz.getShallowSize(); 
    } 
}