ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Native heap 和Dalvik heap 学习总结

2021-09-29 11:33:33  阅读:353  来源: 互联网

标签:kB Dalvik app 内存 heap mmap ------ Native


最近在开发flutter app,发现flutter app的内存使用和之前android java app 有很大区别,flutter app 运行时Native heap占大头,android java app运行时, dalvik heep 占大头。

于是重新学习了一遍android内存知识,大致总结如下

1,进程的地址空间分为stack和heap,

stack是栈,由操作系统控制, 函数地址、参数,内部变量都在栈上,栈不大,一般几MB

heap是堆,由程序员控制,所以malloc, new, free 这些操作符来申请、释放堆内存,所以容易出现申请了但不释放等内存泄漏情况

2,native进程,是由c/c++分配的,/system/bin下面的所有程序运行在native进程中

dalvik进程,是由java程序的dalvik虚拟机分配的,dalvik虚拟机的宿主进程是由fork()系统创建的,所以每个java进程都是运行在一个native进程中

android系统的应用程序基本都是java程序

3,OOM

程序运行时经常会出现OOM现象,这个oom并不是没有ram可以用了,而是因为Dalvik heap的使用超过了系统允许的上限,即vm heap 的最大值

Android google之所以这样设计是为了让更多app常驻内存,不用每次启动都要加载资源浪费时间。

4,Ram真的不足

OOM并不是表示Ram不足,但是一旦ram真的不足,即多个app在后台运行时, 系统将会首先杀死优先级不高的app来释放内存

5,如何查看ram使用信息

adb shell cat /proc/meminfo

D:\>adb shell cat /proc/meminfo

MemTotal:         807776 kB

MemFree:           62648 kB

MemAvailable:     186472 kB

Buffers:            2552 kB

Cached:           121752 kB

SwapCached:          140 kB

Active:           211812 kB

Inactive:         270664 kB

Active(anon):     166164 kB

Inactive(anon):   202052 kB

Active(file):      45648 kB

Inactive(file):    68612 kB

Unevictable:        9180 kB

Mlocked:               0 kB

SwapTotal:        511996 kB

SwapFree:         499492 kB

Dirty:                36 kB

Writeback:             0 kB

AnonPages:        367276 kB

Mapped:            50232 kB

Shmem:               864 kB

Slab:              51064 kB

SReclaimable:      23028 kB

SUnreclaim:        28036 kB

KernelStack:       14368 kB

PageTables:         9464 kB

NFS_Unstable:          0 kB

Bounce:                0 kB

WritebackTmp:          0 kB

CommitLimit:      915884 kB

Committed_AS:   20248668 kB

VmallocTotal:    1048576 kB

VmallocUsed:       94208 kB

VmallocChunk:     852292 kB

HugePages_Total:       0

HugePages_Free:        0

HugePages_Rsvd:        0

HugePages_Surp:        0

Hugepagesize:       2048 kB

6,查看单个进程的内存使用情况

D:\>adb shell dumpsys meminfo com.wocheng.wcy

Applications Memory Usage (kB):

Uptime: 1270811 Realtime: 1270811

** MEMINFO in pid 6768 [com.wocheng.wcy] **

                   Pss  Private  Private  Swapped     Heap     Heap     Heap

                 Total    Dirty    Clean    Dirty     Size    Alloc     Free

                ------   ------   ------   ------   ------   ------   ------

  Native Heap    43062    43060        0       20    55264    40004     3403

  Dalvik Heap     4258     4252        0        4     4508     4297      211

 Dalvik Other     4153     4132        0       76

        Stack      296      296        0        0

    Other dev        5        0        4        0

     .so mmap     7930      464     7092      608

    .jar mmap       28        0       28        0

    .apk mmap       16        0        4        0

    .ttf mmap      734        0      328        0

    .dex mmap     4755      400     4088        0

   Other mmap        8        4        4        0

           GL    46452    46452        0        0

      Unknown    12224    12224        0        4

        TOTAL   123921   111284    11548      712    59772    44301     3614

7,bitmap为什么容易导致OOM

Bitmap的申请是在dalvik heap上,,所以过多的bitmap会造成oom

8,内存错误过程

Dalvik heap增加到vm heap 最大值,出现OOM

当ram增加到最大值,而且无其他app内存释放使用时,会唤醒memory killer

9, flutter 的内存使用主要在native heap 和GL上, 不太容易OOM,但是使用过多的话容易造成memory killer 引起的闪退

标签:kB,Dalvik,app,内存,heap,mmap,------,Native
来源: https://blog.csdn.net/kuanxu/article/details/120545212

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有