Android meminfo
root@htc_e56ml_dtul:/ # dumpsys meminfo -a com.crash.test Applications Memory Usage (kB): Uptime: 18856935 Realtime: 77339653 ** MEMINFO in pid 21813 [com.crash.test] ** Pss Pss Shared Private Shared Private Swapped Heap Heap Heap Total Clean Dirty Dirty Clean Clean Dirty Size Alloc Free ------ ------ ------ ------ ------ ------ ------ ------ ------ ------ Native Heap 3000 0 28736 2096 0 0 980 31948 31831 116 Dalvik Heap 1673 0 2556 1136 0 0 0 27024 24087 2937 Dalvik Other 1087 0 11524 512 0 0 3516 Stack 240 0 0 240 0 0 0 Ashmem 31 0 56 16 0 0 0 Other dev 5 0 60 0 0 4 0 .so mmap 1479 124 1448 156 9156 124 2132 .apk mmap 100 4 0 0 664 4 0 .ttf mmap 37 0 0 0 84 0 0 .dex mmap 276 272 0 4 4 272 4 .oat mmap 947 84 0 0 8668 84 4 .art mmap 1014 8 2204 560 9384 8 168 Other mmap 10 0 12 8 184 0 4 EGL mtrack 17929 0 0 17929 0 0 0 GL mtrack 8045 0 0 8045 0 0 0 Unknown 204 0 100 204 0 0 96 TOTAL 36077 492 46696 30906 28144 496 6904 58972 55918 3053 Dalvik Details .Heap 1508 0 1008 1016 0 0 0 .LinearAlloc 11 0 136 8 0 0 0 .GC 1000 0 11388 428 0 0 3512 .Zygote 161 0 1548 116 0 0 0 .NonMoving 4 0 0 4 0 0 0 .IndirectRef 76 0 0 76 0 0 4 App Summary Pss(KB) ------ Java Heap: 1704 Native Heap: 2096 Code: 644 Stack: 240 Graphics: 25974 Private Other: 744 System: 4675 TOTAL: 36077 TOTAL SWAP (KB): 6904 Objects Views: 18 ViewRootImpl: 1 AppContexts: 2 Activities: 1 Assets: 4 AssetManagers: 2 Local Binders: 9 Proxy Binders: 14 Parcel memory: 3 Parcel count: 12 Death Recipients: 0 OpenSSL Sockets: 0 SQL MEMORY_USED: 0 PAGECACHE_OVERFLOW: 0 MALLOC_SIZE: 0 Uptime: 18857217 Realtime now=77339935 Cursor
下面我们对一些显示出来的数据做分析
Native 层:
Naitve Heap Size(31948): 从mallinfo usmblks获得,代表最大总共分配空间
Native Heap Alloc(31831): 从mallinfo uorblks获得,总共分配空间
Native Heap Free(116): 从mallinfo fordblks获得,代表总共剩余空间
算最后的值时要除以1024
Native Heap Size = Native Heap Alloc + Native Heap Free
31948 = 31831 + 116
Note: mallinfo()是标准C提供的API函数,它返回struct mallinfo结构体。
我分析结果显示:mallinfo ()返回的值并不包含java堆里面分配的内存。java堆和native堆里的内存是分开计算的。
void getMemStatus() { struct mallinfo info = mallinfo (); printf("arena = %ld\n", (long)info.arena); printf("ordblks = %ld\n", (long)info.ordblks); printf("smblks = %ld\n", (long)info.smblks); printf("hblks = %ld\n", (long)info.hblks); printf("hblkhd = %ld\n", (long)info.hblkhd); printf("usmblks = %ld\n", (long)info.usmblks); // = 31948 * 1024 printf("fsmblks = %ld\n", (long)info.fsmblks); printf("uordblks = %ld\n", (long)info.uordblks); // = 31831 * 1024 printf("fordblks = %ld\n", (long)info.fordblks); // = 116 * 1024 printf("keepcost = %ld\n", (long)info.keepcost); }
Java层:
Dalvik Heap size: Dalvik Heap总共的内存大小 27024 = Runtime.getRuntime().totalMemory();
Dalvik Heap free: Dalvik Heap空闲内存大小 2937 = Runtime.getRuntime().freeMemory();
Dalvik Heap Alloc: Dalvik Heap分配内存的大小,这个貌似没有专门的API接口调用
Dalvik Heap size = Dalvik Heap Alloc + Dalvik Heap free
27024 = 24087 + 2937
Runtime 还提供一个显示当前可扩展最大内存的函数: Runtime.getRuntime().maxMemory() 返回值为201326592 = 192M
属性值 [dalvik.vm.heapgrowthlimit]: [192m] 192 = 201326592/(1024*1024)
下面这些是从网上搜集来的信息:
Objects and SQL 信息都是从Android Debug信息中获得。
其他类型 smap 路径名称 描述
Cursor /dev/ashmem/Cursor Cursor消耗的内存(KB)
Ashmem /dev/ashmem 匿名共享内存用来提供共享内存通过分配一个多个进程
Other dev /dev/ 内部driver占用的在 “Other dev”
.so mmap .so C 库代码占用的内存
.jar mmap .jar Java 文件代码占用的内存
.apk mmap .apk apk代码占用的内存
.ttf mmap .ttf ttf 文件代码占用的内存
.dex mmap .dex Dex 文件代码占用的内存
Other mmap 其他文件占用的内存
-------------------------------------------------------------------------------------------------------------
dex2oat编译dex时会出现以下log:
dex2oat took 129.456s (threads: 4) arenaalloc=54MB java alloc=87MB native alloc=183MB free=1773KB swap=144MBdex_size=70MB oat_size=170MB
其中:
native alloc:struct mallinfo中的int uordblks字段,表示Native层分配的内存
free: struct mallinfo中的int fordblks字段,表示Native层空闲未使用的内存
-----------------------------------------------------------------------------------------------------------------------------------
打印堆栈
#include <execinfo.h> #include <stdio.h> #include <stdlib.h> /* Obtain a backtrace and print it to stdout. */ void print_trace (void) { void *array[10]; size_t size; size_t i; size = backtrace (array, 10); printf ("Obtained %zd stack frames./n", size); for (i = 0; i < size; i++) printf ("%p /n", array [i]); } /* A dummy function to make the backtrace more interesting. */ void dummy_function (void) { print_trace (); } int main (void) { dummy_function (); return 0; }

浙公网安备 33010602011771号