2016-10-28 3 views
1

때때로 ART는 범위를 벗어날 때 GC 지역 변수를 사용하지만 때로는 발생하지 않습니다. 그것은 또한 Dalvik을 위해 항상 일어날 것입니다.왜 안드로이드 ART는 범위를 벗어날 때 GC 지역 변수를 때때로 사용하지 않을까요?

다음 테스트 사례를 실행하기 위해 Android Studio 메모리 모니터를 사용했습니다.

@Override 
protected final void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    testMemoryUsage(); // For testing only 
    setupActivity(); // Added to setup the activity to be ready to run 
} 

테스트 케이스 1 (제어)

testMemoryUsage 그냥 빈 방법 :

// For testing only 
private void testMemoryUsage() { 
} 

테스트 케이스 2 (그들은 모두 testMemoryUsage가에서 onCreate에 추가하는 방법에 대해이야 최종 최종 로컬 변수)

testMemoryUsage는 리터 지역 변수 uniqueStrings :

// For testing only 
private void testMemoryUsage() { 
    List<String> uniqueStrings = new Vector<>(); 
    for (Integer index = 0; index < 1000000; index++) { 
     uniqueStrings.add(index.toString()); 
    } 
} 

테스트 흐름 매 10 초마다 약

는 응용 프로그램 버튼을 장치를 다시 눌러 즉시 응용 프로그램 아이콘을 클릭하여 재개에 의해 폐쇄됩니다.

테스트 장치

GT-N7000 (안드로이드 버전 4.1.2) - 달빅

LG-D802 (안드로이드 버전 4.4.2) - 달빅

LG-H860을 (안드로이드 버전 6.0.1) - ART

5X 넥서스 (안드로이드 7.0) - ART

differen 2 개 장치를 각각 사용하여 안드로이드 버전, Dalvik 및 2 개의 장치, 각각 다른 안드로이드 버전, ART,이 설정은 Dalvik 및 ART 대신 장치 및 Android 버전으로 인한 변수를 제거해야합니다.

메모리 모니터는 제어 시험 사건으로

Memory Monitor Result 1(LG-H860 in Test Case 1)

넥서스 5 배 (ART)는 본질적으로 유사한 메모리 모니터 결과를 보여줍니다 결과. 그러나 GT-N7000 (Dalvik)과 LG-D802 (Dalvik)는 거의 비슷한 결과를 보여줍니다.

Memory Monitor Result 2(LG-H860 in Test Case 2)

넥서스 5X (ART)는 본질적으로 유사한 메모리 모니터 한 결과를 나타낸다. 그러나 GT-N7000 (Dalvik)과 LG-D802 (Dalvik) 모두 톱니 모양의 결과를 보여 주며 1000000 개의 고유 한 문자열을 모두 추가 할 때 드롭 에지가 발생하므로 Dalvik은 항상 로컬 변수 uniqueString을 GC에서 즉시 GC합니다. 범위 testMemoryUsage.

ART의 경우 1 번째 및 2 번째 앱 출시를 위해 범위 testMemoryUsage에서 나올 때 지역 변수 uniqueStrings를 GC에서 수행하지만 가끔씩 수행하지 않는 경우가 있습니다. 또한 때로는 그러한 GC가 후속 닫기 및 다시 열기를 위해 수행되지만 때로는 수행되기도합니다.

나는이 테스트를 LG-H860 (ART) 및 Nexus 5X (ART)에서 각각 거의 10 번 실행했으며, 동일한 테스트 에서조차도 메모리 모니터 결과가 (때때로 앞서 말한 "때로는") 일치하지 않습니다. 1 포인트를 제외하고 같은 테스트 장치 - GC가 앞서 언급 한 타이밍에 즉시 발생하거나 기다리는 시간과 관계없이 발생합니다. 앱 내부에서 다른 작업을 수행 할 수도 있습니다. 그러나 GT-N7000 (Dalvik) 및 LG-D802 (Dalvik)의 메모리 모니터 결과는 매우 일치합니다. ,

정말이 모든 문제의 근원 예술 :

나는 답변을 인터넷에서 검색을 시도했다, 그러나 나는 노력의 시간에도 불구하고 아무것도 찾지 못했습니다, 그래서 여기에 요청하기로 결정 또는 나는 몇몇 중대한 실수를 했습니까?

답변

1

ART의 GC 알고리즘은 Dalvik의 GC 알고리즘과 다릅니다. Dalvik은 응용 프로그램이 종료 되 자마자 실행되고 응용 프로그램이 계속 실행되어 차단 된 작업으로 인해 UI 스레드 일시 중지를 유발합니다. 만료시 Dalvik 동작은 완벽합니다. 앱이 종료 되 자마자 트리거되며 메모리를 지우는 동시 GC 스윕을 수행합니다.

ART의 기본 계획은 주로 끈적 CMS 및 부분 CMS를 사용하는 CMS (동시 마크 스윕) 계획입니다. 고정 CMS는 ART의 이동하지 않는 세대 별 가비지 수집기입니다. 마지막 GC 이후에 수정 된 힙 부분 만 검색하고 마지막 GC 이후에 할당 된 객체 만 회수 할 수 있습니다. CMS 계획 외에도 ART는 앱이 프로세스 상태를 jank-intellceptible 프로세스 상태 (예 : 백그라운드 또는 캐시 됨)로 변경하면 힙 압축을 수행합니다. 따라서 ART의 GC 동작이 완벽하고 다음 GC 스윕주기가 메모리를 비울 때까지 기다리는 것을 볼 수 있습니다. 이는 두 가지 방식으로 도움이됩니다.

  1. 비동기 GC 스윕이 없습니다. 따라서 Dalvik에 비해 GC 스윕 수가 줄어 듭니다.
  2. 귀하의 경우에는 앱이 즉시 다시 실행되므로 메모리가 적절하게 재사용됩니다.

그래서 ART는 이러한 모든 문제의 원인이 아니지만 디자인에 따라 어떻게 작동할까요?

당신은 내가이 요청하기 전에 그 기사를 읽었습니다 here

+0

더 자세한 정보를 얻을 것이다, 그러나 당신의 대답은 내가 그것을 더 이해하는 데 도움이됩니다. 감사. – DoubleX