邏輯內(nèi)存和RAM
- 進(jìn)程的地址空間
32位操作系統(tǒng)中桑滩,進(jìn)程的地址空間為0到4GB
示意圖如下:
- 進(jìn)程內(nèi)存空間和RAM之間的關(guān)系
進(jìn)程的內(nèi)存空間只是虛擬內(nèi)存(也可以叫做邏輯內(nèi)存)渤愁,而程序運(yùn)行需要實(shí)實(shí)在在的內(nèi)存衅金,也就是物理內(nèi)存RAM。
在必要時(shí)嚎京,操作系統(tǒng)會(huì)將程序中申請(qǐng)的內(nèi)存(虛擬內(nèi)存)映射到RAM既穆,讓進(jìn)程能夠使用物理內(nèi)存。
Android 中的進(jìn)程
Android 中包含 native 進(jìn)程和 java進(jìn)程起胰。
1久又、nativie 進(jìn)程:采用C/C++ 實(shí)現(xiàn),不包含dalvik實(shí)例的進(jìn)程效五。/system/bin/目錄下面的程序文件運(yùn)行后都是以native進(jìn)程形式存在的地消。
2、java進(jìn)程:Android中運(yùn)行與dalvik 虛擬機(jī)之上的進(jìn)程畏妖。
dalvik虛擬機(jī)的宿主進(jìn)程由fork()系統(tǒng)調(diào)用創(chuàng)建脉执,所以每一個(gè)java進(jìn)程都是存在于一個(gè)native進(jìn)程中,因此瓜客,java進(jìn)程的內(nèi)存分配比native進(jìn)程復(fù)雜适瓦,因?yàn)檫M(jìn)程中存在一個(gè)虛擬機(jī)實(shí)例。
Android 進(jìn)程中的堆內(nèi)存谱仪。
1、
android 內(nèi)存結(jié)構(gòu)如下所示:
其中堆空間完全由程序員控制:
我們使用的C malloc否彩、C++ new和java new所申請(qǐng)的空間都是heap空間疯攒。
C/C++申請(qǐng)的內(nèi)存空間在native heap中,
而java申請(qǐng)的內(nèi)存空間則在dalvik heap中列荔。
2敬尺、dalvik 堆 的大小限制。
廠商在定制android系統(tǒng)時(shí)贴浙,通過dalvik.vm.heapsize 參數(shù)限制了每一個(gè)dalvik 進(jìn)程的最大堆內(nèi)存砂吞。程序申請(qǐng)的java heap對(duì)象超過了dalvik vm heapsize 時(shí),就會(huì)觸發(fā)OOM崎溃。
- java程序發(fā)生OMM并不是表示RAM不足蜻直。而是堆內(nèi)存超出了dalvik.vm.heapsize的限制。如果RAM真的不足,會(huì)發(fā)生什么呢概而?這時(shí)Android的memory killer會(huì)起作用呼巷,當(dāng)RAM所剩不多時(shí),memory killer會(huì)殺死一些優(yōu)先級(jí)比較低的進(jìn)程來釋放物理內(nèi)存赎瑰,讓高優(yōu)先級(jí)程序得到更多的內(nèi)存王悍。
- dalvik.vm.heapsize 的顯示,僅是對(duì)dalvik進(jìn)程中java對(duì)的限制餐曼。對(duì)native 堆 并沒有限制压储。所以在android程序中natvie 堆的內(nèi)存可以很大。
3源譬、應(yīng)用程序如何突破dalvik.vm.heapsize 的限制集惋。
- 創(chuàng)建子進(jìn)程。創(chuàng)建一個(gè)新的進(jìn)程瓶佳,那么我們就可以把一些對(duì)象分配到新進(jìn)程的heap上了芋膘,從而達(dá)到一個(gè)應(yīng)用程序使用更多的內(nèi)存的目的。
- 使用jni在native heap上申請(qǐng)空間(推薦使用)霸饲。nativeheap的增長并不受dalvik vm heapsize的限制为朋。只要RAM有剩余空間,程序員可以一直在native heap上申請(qǐng)空間厚脉,當(dāng)然如果 RAM快耗盡习寸,memory killer會(huì)殺進(jìn)程釋放RAM。
- 使用顯存傻工。使用 OpenGL textures 等 API 霞溪, texture memory 不受 dalvik vm heapsize 限制。
查看 應(yīng)用進(jìn)程的內(nèi)存
- 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