逻辑内存和RAM
- 进程的地址空间
32位操作系统中,进程的地址空间为0到4GB
示意图如下:
- 进程内存空间和RAM之间的关系
进程的内存空间只是虚拟内存(也可以叫做逻辑内存),而程序运行需要实实在在的内存,也就是物理内存RAM。
在必要时,操作系统会将程序中申请的内存(虚拟内存)映射到RAM,让进程能够使用物理内存。
Android 中的进程
Android 中包含 native 进程和 java进程。
1、nativie 进程:采用C/C++ 实现,不包含dalvik实例的进程。/system/bin/目录下面的程序文件运行后都是以native进程形式存在的。
2、java进程:Android中运行与dalvik 虚拟机之上的进程。
dalvik虚拟机的宿主进程由fork()系统调用创建,所以每一个java进程都是存在于一个native进程中,因此,java进程的内存分配比native进程复杂,因为进程中存在一个虚拟机实例。
Android 进程中的堆内存。
1、
android 内存结构如下所示:
其中堆空间完全由程序员控制:
我们使用的C malloc、C++ new和java new所申请的空间都是heap空间。
C/C++申请的内存空间在native heap中,
而java申请的内存空间则在dalvik heap中。
2、dalvik 堆 的大小限制。
厂商在定制android系统时,通过dalvik.vm.heapsize 参数限制了每一个dalvik 进程的最大堆内存。程序申请的java heap对象超过了dalvik vm heapsize 时,就会触发OOM。
- java程序发生OMM并不是表示RAM不足。而是堆内存超出了dalvik.vm.heapsize的限制。如果RAM真的不足,会发生什么呢?这时Android的memory killer会起作用,当RAM所剩不多时,memory killer会杀死一些优先级比较低的进程来释放物理内存,让高优先级程序得到更多的内存。
- dalvik.vm.heapsize 的显示,仅是对dalvik进程中java对的限制。对native 堆 并没有限制。所以在android程序中natvie 堆的内存可以很大。
3、应用程序如何突破dalvik.vm.heapsize 的限制。
- 创建子进程。创建一个新的进程,那么我们就可以把一些对象分配到新进程的heap上了,从而达到一个应用程序使用更多的内存的目的。
- 使用jni在native heap上申请空间(推荐使用)。nativeheap的增长并不受dalvik vm heapsize的限制。只要RAM有剩余空间,程序员可以一直在native heap上申请空间,当然如果 RAM快耗尽,memory killer会杀进程释放RAM。
- 使用显存。使用 OpenGL textures 等 API , texture memory 不受 dalvik vm heapsize 限制。
查看 应用进程的内存
- adb shell dumpsys meminfo + 包名/pid
feifeideMacBook-Pro:1111 feifei$ adb shell dumpsys meminfo com.sogou.teemo.translate.launcher
Applications Memory Usage (in Kilobytes):
Uptime: 3051055 Realtime: 3051055
** MEMINFO in pid 1029 [com.sogou.teemo.translate.launcher] **
Pss Private Private SwapPss Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 509764 509588 0 0 599040 583603 15436
Dalvik Heap 7017 6800 0 0 10678 6407 4271
Dalvik Other 1356 1352 0 0
Stack 40 40 0 0
Ashmem 4 4 0 0
Other dev 3444 0 8 0
.so mmap 22022 568 16844 0
.apk mmap 1030 0 24 0
.ttf mmap 51 0 0 0
.dex mmap 8129 4 4944 0
.oat mmap 6449 0 440 0
.art mmap 2039 1052 108 0
Other mmap 193 8 0 0
Unknown 2746 2728 0 0
TOTAL 564284 522144 22368 0 609718 590010 19707
App Summary
Pss(KB)
------
Java Heap: 7960
Native Heap: 509588
Code: 22824
Stack: 40
Graphics: 0
Private Other: 4100
System: 19772
TOTAL: 564284 TOTAL SWAP PSS: 0
Objects
Views: 29 ViewRootImpl: 1
AppContexts: 3 Activities: 1
Assets: 2 AssetManagers: 2
Local Binders: 20 Proxy Binders: 20
Parcel memory: 8 Parcel count: 32
Death Recipients: 2 OpenSSL Sockets: 0
WebViews: 0
SQL
MEMORY_USED: 829
PAGECACHE_OVERFLOW: 561 MALLOC_SIZE: 62
DATABASES
pgsz dbsz Lookaside(b) cache Dbname
4 52 60 13/23/6 /data/user/0/com.sogou.teemo.translate.launcher/databases/bugly_db_
4 36 51 4/22/5 /data/user/0/com.sogou.teemo.translate.launcher/databases/okdownload-breakpoint.db
4 2144 56 1/19/2 /data/user/0/com.sogou.teemo.translate.launcher/databases/province_v14.db
- 查看heapsize
adb shell getprop | grep dalvik.vm.heapsize