native 內(nèi)存和 dalvik內(nèi)存

邏輯內(nèi)存和RAM

  • 進(jìn)程的地址空間
    32位操作系統(tǒng)中,進(jìn)程的地址空間為0到4GB

示意圖如下:

image
  • 進(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)存。
image

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)如下所示:


image

其中堆空間完全由程序員控制:
我們使用的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的增長(zhǎng)并不受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

參考文章

https://www.cnblogs.com/lianghe01/p/6617275.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 操作系統(tǒng)對(duì)內(nèi)存的管理 沒有內(nèi)存抽象的年代 在早些的操作系統(tǒng)中,并沒有引入內(nèi)存抽象的概念。程序直接訪問和操作的都是物...
    Mr槑閱讀 16,972評(píng)論 3 24
  • 非常棒的一片博文,在這里轉(zhuǎn)一下。感謝作者。Android進(jìn)程的內(nèi)存管理分析最近在網(wǎng)上看了不少Android內(nèi)存管理...
    任易Change閱讀 813評(píng)論 0 0
  • 在 Java 中,內(nèi)存的分配是由程序完成的,而內(nèi)存的釋放則是由 Garbage Collecation(GC) 完...
    Shawn_Dut閱讀 6,147評(píng)論 3 28
  • 一.操作系統(tǒng)相關(guān)基礎(chǔ)知識(shí) 1.物理內(nèi)存、虛擬內(nèi)存、邏輯地址與交換空間 物理內(nèi)存(RAM):加載到內(nèi)存地址寄存器中的...
    Geeks_Liu閱讀 9,504評(píng)論 6 31
  • 舊時(shí)春風(fēng)笑影重 櫻花滿樹紅 你站在樹下 嘴咬著吸管 草長(zhǎng)鶯飛蝶引夢(mèng) 月瘦花香濃 你隨夜而動(dòng) 消失在夢(mèng)中 故地重游晨...
    那一年t閱讀 152評(píng)論 2 0

友情鏈接更多精彩內(nèi)容