Android在5.0之前使用Dalvik虚拟机。Dalvik 基于寄存器,而 JVM 基于栈。
Dalvik的内存分为3部分:
1.Java Object Heap:这部分是用来分配java对象的,app中java代码new出来的对象都在这个heap当中分配。 Android系统对dalvik的heap size作了硬性限制,不同的手机可能根据自身内存大小为Java Object Heap配置了不同的大小。当java进程申请的java空间超过阈值时,就会抛出OOM异常。 在代码中可以使用ActivityManager.getMemoryClass方法获取该值。Java Object Heap的最大值就是app能够使用的最大内存。下面是我的Nexus5的配置:
[dalvik.vm.heapsize]: [512m]
[dalvik.vm.heapstartsize]: [8m]
2. Bitmap Memory: 也称为External Memroy ,是用来处理图像的。 在Android3.1之前,BitmapMemory是在Native Heap中进行分配, 但是这部分内存同样计入到了Java ObjectHeap中 。在3.1之后的版本中, BitmapMemory直接在Java Object Heap中进行分配,可以接收GC管理了。Bitmap是吃内存大户,要谨慎合理的使用。
3. Native Memory: Native Code中使用malloc分配出来的内存,就是分配在Native Heap. 这部分内存不受Java Object Heap限制,可以自由使用。虽然这么说,但是不能过于贪心,如果过多的使用这部分内存,则可能引起GC被回收,造成app莫名的奔溃。
在调试时可以使用一下命令查看app内存使用情况。
adb shell dumpsys meminfo $package/$pid
下面是dump相册的内存使用的结果。
shell@hammerhead:/ $ dumpsys meminfo com.google.android.apps.photos
dumpsys meminfo com.google.android.apps.photos
Applications Memory Usage (kB):
Uptime: 447210103 Realtime: 1130534558
** MEMINFO in pid 6511 [com.google.android.apps.photos] **
Pss Private Private Swapped Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 6253 5912 0 0 23808 21797 2010
Dalvik Heap 10778 10676 0 0 31885 25032 6853
Dalvik Other 988 988 0 0
Stack 264 264 0 0
Ashmem 4 4 0 0
Gfx dev 6036 6036 0 0
Other dev 4 0 4 0
.so mmap 691 140 0 0
.apk mmap 1163 0 768 0
.ttf mmap 76 0 72 0
.dex mmap 10432 4 10428 0
.oat mmap 1440 0 476 0
.art mmap 965 676 40 0
Other mmap 470 8 368 0
EGL mtrack 41280 41280 0 0
Unknown 136 136 0 0
TOTAL 80980 66124 12156 0 55693 46829 8863
App Summary
Pss(KB)
------
Java Heap: 11392
Native Heap: 5912
Code: 11888
Stack: 264
Graphics: 47316
Private Other: 1508
System: 2700
TOTAL: 80980 TOTAL SWAP (KB): 0
Objects
Views: 112 ViewRootImpl: 1
AppContexts: 2 Activities: 1
Assets: 2 AssetManagers: 2
Local Binders: 31 Proxy Binders: 22
Parcel memory: 9 Parcel count: 38
Death Recipients: 1 OpenSSL Sockets: 0
SQL
MEMORY_USED: 552
PAGECACHE_OVERFLOW: 316 MALLOC_SIZE: 62
DATABASES
pgsz dbsz Lookaside(b) cache Dbname
4 272 52 5/22/4 /data/user/0/com.google.android.apps.photos/databases/disk_cache
4 272 27 3/16/4 /data/user/0/com.google.android.apps.photos/databases/disk_cache (1)
4 28 45 6/19/5 /data/user/0/com.google.android.apps.photos/databases/google_analytics_v4.db