때때로 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)의 메모리 모니터 결과는 매우 일치합니다. ,
정말이 모든 문제의 근원 예술 :
나는 답변을 인터넷에서 검색을 시도했다, 그러나 나는 노력의 시간에도 불구하고 아무것도 찾지 못했습니다, 그래서 여기에 요청하기로 결정 또는 나는 몇몇 중대한 실수를 했습니까?
더 자세한 정보를 얻을 것이다, 그러나 당신의 대답은 내가 그것을 더 이해하는 데 도움이됩니다. 감사. – DoubleX