Android Logcat에서 GC_FOR_MALLOC, GC_EXPLICIT 및 기타 GC_ *는 무엇을 의미합니까?
Android 로그를 보면 많은 것을 볼 수 있습니다.
그것들이 의미하는 바, 그것들을 아는 것은 우리가 더 나은 메모리 할당을하는 데 도움이 될 수 있습니다.
예:
28470 dalvikvm D GC_FOR_MALLOC freed 665 objects / 239992 bytes in 71ms
28470 dalvikvm D GC_FOR_MALLOC freed 673 objects / 240288 bytes in 87ms
21940 dalvikvm D GC_EXPLICIT freed 4802 objects / 185320 bytes in 78ms
28470 dalvikvm D GC_FOR_MALLOC freed 666 objects / 240536 bytes in 63ms
GC_FOR_MALLOC 는 할당을 수행하기 위해 힙에 충분한 메모리가 남아 있지 않기 때문에 GC가 트리거 되었음을 의미합니다. 새 개체가 생성 될 때 트리거 될 수 있습니다.
GC_EXPLICIT 는 가비지 수집기가 힙의 최고 수위 표시에 의해 트리거되는 대신 명시 적으로 수집하도록 요청 되었음을 의미합니다. 모든 곳에서 발생하지만 스레드가 종료되거나 바인더 통신이 중단 될 때 가장 가능성이 높습니다.
다른 몇 가지도 있습니다.
GC_CONCURRENT 힙이 수집 할 특정 양의 개체에 도달하면 트리거됩니다.
GC_EXTERNAL_ALLOC 는 VM이 수집 가능한 개체에 사용되는 메모리 양을 줄여 수집 불가능한 공간을 확보하려고한다는 것을 의미합니다.
업데이트 : Android 이후 버전에서 첫 번째 이벤트의 이름이 변경되었습니다. 이제 "GC_FOR_ALLOC"라고합니다. 최신 전화기에서는 매우 드물지만 사용할 수있는 새로운 이벤트도 있습니다. GC_BEFORE_OOM 은 시스템의 메모리가 매우 부족하여 메모리 부족 킬러 호출을 피하기 위해 최종 GC가 수행 되었음을 의미합니다.
Dalvik 가비지 수집기 메시지가 설명되는 또 다른 위치는 다음 동영상입니다. Google I / O 2011 : Android 앱을위한 메모리 관리
프레젠테이션 후 약 14 분에 그는 메시지 형식을 세분화합니다. (BTW, 그 비디오에는 메모리 누수 디버깅에 대한 정말 좋은 정보가 있습니다)
대략적으로 말하면 형식은 [Reason] [Amount Freed], [Heap Statistics], [External Memory Statistics], [Pause Time]
이유
Robert / yuku는 이미 이것들의 의미에 대한 정보를 제공했습니다.
해제 된 금액
예 freed 2125K
자기 설명
힙 통계
예 47% free 6214K/11719K
이 수치는 GC 실행 후 조건을 반영합니다. "47 % 사용 가능"및 6214K는 현재 힙 사용량을 반영합니다. 11719K는 총 힙 크기를 나타냅니다. 내가 알 수 있듯이 힙이 커지거나 줄어들 수 있으므로이 제한에 도달하면 반드시 OutOfMemoryError가 발생하지는 않습니다.
외부 메모리 통계
예 external 7142K/8400K
참고 : 이는 Honeycomb 이전 버전의 Android (3.0 이전)에만 존재할 수 있습니다.
Honeycomb 이전에는 비트 맵이 VM 외부에 할당됩니다 (예 : Bitmap.createBitmap ()은 비트 맵을 외부 적으로 할당하고 로컬 힙에 수십 바이트 만 할당합니다). 외부 할당의 다른 예는 java.nio.ByteBuffers입니다.
일시 중지 시간
동시 GC 이벤트 인 경우 두 번 나열됩니다. 하나는 GC 이전의 일시 중지 용이고 다른 하나는 GC가 대부분 완료되었을 때의 일시 중지 용입니다. 예paused 3ms+5ms
비 동시 GC 이벤트의 경우 일시 중지 시간이 하나 뿐이며 일반적으로 훨씬 더 큽니다. 예paused 87ms
나는 또한 이것을 안드로이드 소스, dalvik/vm/alloc/Heap.h. 이것이 유용 할 수 있습니다.
typedef enum {
/* Not enough space for an "ordinary" Object to be allocated. */
GC_FOR_MALLOC,
/* Automatic GC triggered by exceeding a heap occupancy threshold. */
GC_CONCURRENT,
/* Explicit GC via Runtime.gc(), VMRuntime.gc(), or SIGUSR1. */
GC_EXPLICIT,
/* GC to try to reduce heap footprint to allow more non-GC'ed memory. */
GC_EXTERNAL_ALLOC,
/* GC to dump heap contents to a file, only used under WITH_HPROF */
GC_HPROF_DUMP_HEAP
} GcReason;
'Program Club' 카테고리의 다른 글
| Vim 명령 줄에서 어떻게 이동할 수 있습니까? (0) | 2020.11.22 |
|---|---|
| Oracle 데이터베이스 열의 특정 값을 바꾸는 방법은 무엇입니까? (0) | 2020.11.22 |
| xUnit Runner가 내 테스트를 찾지 못하는 이유 (0) | 2020.11.22 |
| 루프에서 arr.length 대신 arr.lenght (misspelt)를 사용할 때 JavaScript가 경고를 표시하지 않는 이유는 무엇입니까? (0) | 2020.11.21 |
| 어떤 단점이 있습니까? (0) | 2020.11.21 |