질문 : Android에서 내 애플리케이션의 메모리 사용량을 어떻게 확인합니까?
프로그래밍 방식으로 Android 애플리케이션에서 사용되는 메모리를 어떻게 찾을 수 있습니까?
할 수있는 방법이 있기를 바랍니다. 또한 휴대폰의 여유 메모리도 어떻게 얻습니까?
답변
Linux와 같은 최신 운영 체제에서 메모리 사용은 매우 복잡하고 이해하기 어려운 영역입니다. 사실 당신이 얻는 숫자를 정확하게 해석 할 가능성은 극히 낮습니다. (다른 엔지니어와 함께 메모리 사용 수치를 볼 때마다 거의 항상 그들이 실제로 의미하는 바에 대한 긴 논의가있어 모호한 결론을 내릴뿐입니다.)
참고 : 이제 여기에있는 자료의 대부분을 다루고 Android 상태에 대한 최신 정보 인 앱의 메모리 관리에 대한 훨씬 더 광범위한 문서가 있습니다.
먼저 Android에서 메모리를 관리하는 방법에 대한 논의가있는이 기사의 마지막 부분을 읽는 것입니다.
이제 ActivityManager.getMemoryInfo()
는 전체 메모리 사용량을 확인하기위한 최고 수준의 API입니다. 이것은 대부분 시스템이 백그라운드 프로세스를위한 메모리가 더 이상 없어지는 정도를 측정하는 데 도움이되므로 서비스와 같은 필요한 프로세스를 종료해야합니다. 순수한 Java 애플리케이션의 경우, 이는 하나의 앱이이 지점까지 시스템에 스트레스를주지 않도록 부분적으로 Java 힙 제한이 있기 때문에 거의 사용되지 않습니다.
하위 수준으로 이동하면 Debug API를 사용하여 메모리 사용량에 대한 원시 커널 수준 정보를 얻을 수 있습니다. android.os.Debug.MemoryInfo
2.0부터는 API, ActivityManager.getProcessMemoryInfo
도 있으며 다른 프로세스에 대한이 정보를 가져옵니다. ActivityManager.getProcessMemoryInfo (int [])
이 모든 데이터가 포함 된 저수준 MemoryInfo 구조를 반환합니다.
/** The proportional set size for dalvik. */
public int dalvikPss;
/** The private dirty pages used by dalvik. */
public int dalvikPrivateDirty;
/** The shared dirty pages used by dalvik. */
public int dalvikSharedDirty;
/** The proportional set size for the native heap. */
public int nativePss;
/** The private dirty pages used by the native heap. */
public int nativePrivateDirty;
/** The shared dirty pages used by the native heap. */
public int nativeSharedDirty;
/** The proportional set size for everything else. */
public int otherPss;
/** The private dirty pages used by everything else. */
public int otherPrivateDirty;
/** The shared dirty pages used by everything else. */
public int otherSharedDirty;
Pss
, PrivateDirty
및 SharedDirty
의 차이점에 대해서는 이제 재미가 시작됩니다.
Android (및 일반적으로 Linux 시스템)의 많은 메모리는 실제로 여러 프로세스에서 공유됩니다. 따라서 프로세스가 사용하는 메모리 양은 실제로 명확하지 않습니다. 디스크에 페이징 아웃 (Android에서 사용하지 않는 스왑은 제외)을 추가하면 훨씬 덜 명확합니다.
따라서 각 프로세스에 실제로 매핑 된 모든 물리적 RAM을 가져 와서 모든 프로세스를 합산하면 실제 총 RAM보다 훨씬 더 많은 수를 얻게 될 것입니다.
Pss
수는 메모리 공유를 고려하여 커널이 계산하는 메트릭입니다. 기본적으로 프로세스의 각 RAM 페이지는 해당 페이지를 사용하는 다른 프로세스 수의 비율로 확장됩니다. 이 방법으로 (이론적으로) 모든 프로세스에서 pss를 더하여 사용중인 총 RAM을 확인하고 프로세스 간의 pss를 비교하여 상대적 가중치에 대한 대략적인 아이디어를 얻을 수 있습니다.
여기서 또 다른 흥미로운 측정 항목은 PrivateDirty
. 이것은 기본적으로 디스크로 페이징 할 수없고 (디스크의 동일한 데이터에 의해 지원되지 않음) 다른 프로세스와 공유되지 않는 프로세스 내부 RAM의 양입니다. 이를 확인하는 또 다른 방법은 해당 프로세스가 사라질 때 시스템에서 사용할 수있는 RAM입니다 (그리고 캐시 및 기타 용도로 빠르게 포함됨).
이것이 바로이를위한 SDK API입니다. 그러나 개발자로서 기기로 할 수있는 일이 더 많습니다.
adb
사용하면 실행중인 시스템의 메모리 사용에 대해 얻을 수있는 많은 정보가 있습니다. 일반적인 것은 adb shell dumpsys meminfo
명령으로, 각 Java 프로세스의 메모리 사용에 대한 정보를 뱉어내는 것입니다. 여기에는 위의 정보와 기타 다양한 정보가 포함됩니다. adb shell dumpsys meminfo system
이 시스템 프로세스를 제공하는 것과 같이 단일 프로세스의 이름 또는 pid를 확인할 수도 있습니다.
맨 위 섹션은 기본 섹션입니다. 여기서 size
는 특정 힙의 주소 공간에있는 총 크기이고, allocated
은 힙이 가지고 있다고 생각하는 실제 할당의 kb, free
는 힙이 추가 할당을 위해 사용 가능한 나머지 kb, pss
및 priv dirty
는 각 힙과 관련된 페이지에 대해 앞서 설명한 것과 동일합니다.
모든 프로세스에서 메모리 사용량을 확인하려는 경우 adb shell procrank
명령을 사용할 수 있습니다. 동일한 시스템에 대한 출력은 다음과 같습니다.
여기서 Vss
및 Rss
열은 기본적으로 노이즈입니다 (이는 프로세스의 직접적인 주소 공간 및 RAM 사용량이며, 프로세스간에 RAM 사용량을 더하면 엄청나게 많은 수를 얻게됩니다).
Pss
는 이전에 보았던 것과 Uss
는 Priv Dirty
입니다.
여기서 주목해야 할 흥미로운 점 : Pss
와 Uss
meminfo
에서 본 것과 약간 (또는 약간 이상) 다릅니다. 왜 그런 겁니까? meminfo
와는 다른 커널 메커니즘을 사용하여 데이터를 수집하며 약간 다른 결과를 제공합니다. 왜 그런 겁니까? 솔직히 단서가 없습니다. procrank
가 더 정확한 것일 수 있다고 믿습니다. 그러나 실제로 이것은 "소금으로 얻은 모든 메모리 정보를 가져 오십시오. 종종 매우 큰 입자입니다."
마지막으로 시스템의 전체 메모리 사용량에 대한 요약을 제공하는 adb shell cat /proc/meminfo
여기에는 많은 데이터가 있으며, 논의 할 가치가있는 처음 몇 개의 숫자 만 있습니다 (그리고 소수의 사람들이 이해하는 나머지 숫자와 그들에 대한 소수의 사람들에 대한 나의 질문은 종종 상충되는 설명을 초래합니다).
MemTotal
은 커널 및 사용자 공간에서 사용할 수있는 총 메모리 양입니다 (일반적으로 장치의 실제 실제 RAM보다 적습니다. 일부 RAM은 라디오, DMA 버퍼 등에 필요하기 때문입니다).
MemFree
는 전혀 사용되지 않는 RAM의 양입니다. 여기 보이는 숫자는 매우 높습니다. 일반적으로 Android 시스템에서는 프로세스 실행을 유지하기 위해 사용 가능한 메모리를 사용하기 때문에 몇 MB 밖에되지 않습니다.
Cached
것은 파일 시스템 캐시와 다른 것들에 사용되는 RAM입니다. 잘못된 페이징 상태가되지 않도록하려면 일반적인 시스템에 20MB 정도가 필요합니다. Android 메모리 부족 킬러는 특정 시스템에 맞게 조정되어 캐시 된 RAM이 너무 많이 소모되어 페이징이 발생하기 전에 백그라운드 프로세스가 종료되도록합니다.
출처 : https://stackoverflow.com/questions/2298208/how-do-i-discover-memory-usage-of-my-application-in-android
'프로그래밍 언어 > Android' 카테고리의 다른 글
Android에서 경고 대화 상자를 표시하는 방법 (0) | 2021.07.29 |
---|---|
Android : 소프트 키보드가 내 보기를 밀어 올리는 것 방지하는 방법 (0) | 2021.07.29 |
Android 버튼에서 drawableLeft를 프로그래밍 방식으로 설정하는 방법 (0) | 2021.07.23 |
Android에서 현재 시간과 날짜를 얻는 방법 (0) | 2021.07.21 |
Android Studio에서 'assets'폴더의 올바른 위치 (0) | 2021.07.21 |