最近在开发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 引起的闪退

Native heap 和Dalvik heap 学习总结相关推荐

  1. 算法学习 (门徒计划)2-2 堆(Heap)与优先队列 学习笔记

    算法学习 (门徒计划)2-2 堆(Heap)与优先队列 学习笔记 前言 堆(Heap)的概念和基础操作 基础概念 基础操作 入堆与上滤 出堆与下滤 自定义类实现堆 优先队列 经典例题,堆的基础应用 l ...

  2. MAT工具学习,incoming reference和outgoing reference,Shallow Heap和Retained Heap

    MAT工具学习 incoming reference和outgoing reference Shallow Heap和Retained Heap 常用工具 一般思路 incoming referenc ...

  3. Heap Allocation Profiles (heap=sites)

    Heap Allocation Profiles (heap=sites) 基于JDK-6,使用的类不同,展示的信息可能不同,内容一样的javac -J-agentlib:hprof=heap=sit ...

  4. java heap 参数_java heap space解决方法和JVM参数设置

    因为程序要从数据读取近10W行记录处理,当读到9W的时候就出现 java.lang.OutOfMemoryError: Java heap space 这样的错误. 在网上一查可能是JAVA的堆栈设置 ...

  5. Eclipse MAT 里面的SHALLOW HEAP和RETAINED HEAP是什么意思?

    原文在这里: Eclipse MAT 里面的SHALLOW HEAP和RETAINED HEAP是什么意思? MAT是一款非常强大的JVM内存映像分析工具,对分析内存相关的问题非常有用,MAT报告中对 ...

  6. java heap 查看_JAVA HEAP查看简单办法

    JAVA HEAP查看简单办法 最近在看JVM有关东西,发现一个简单和free的HEAP DUMP查看方式(基于SUN JDK) 先使用 jmap -dump:live,format=b,file=h ...

  7. 全能Android HOOK框架 JNI NATIVE JAVA ART DALVIK

    OneHook 目前比较流行的几个安卓HOOK方案,都有功能上的欠缺,有的不支持art模式,有的不支持jni层,有的不支持侵入HOOK. 所以OneHook诞生了! 这是一个同时支持ART和Dalvi ...

  8. 全能HOOK框架 JNI NATIVE JAVA ART DALVIK

    OneHook 目前比较流行的几个安卓HOOK方案,都有功能上的欠缺,有的不支持art模式,有的不支持jni层,有的不支持侵入HOOK. 所以OneHook诞生了! 这是一个同时支持ART和Dalvi ...

  9. java heap 参数_java heap space解决方法和JVM参数设置--- JVM参数设置和程序优化篇

    业界有很多强大的java profile的工具,比如Jporfiler,yourkit,这些收费的东西我就不想说了,想说的是,其实java自己就提供了很多内存监控的小工具,下面列举的工具只是一小部分, ...

最新文章

  1. jQuery 1.9 移除了 $.browser 的替代方法
  2. applet打包的MANIFEST.MF配置
  3. 发现WinSRV2003SP1并没有包含ASP+Access的BUG更新
  4. 什么是Memcache
  5. python安装tensorflow_tensorflow安装过程-(windows环境下)---详解(摆平了很多坑!)...
  6. 生日蜡烛——第七届蓝桥杯C语言B组(省赛)第二题
  7. 报表被老板吐槽又多又丑?因为你没有掌握这些动态报表的技巧
  8. 应用程序错误 应用程序发生异常w3wp.exe
  9. ZooKeeper 3.0.0发行说明
  10. Java基础04 编译与反编译
  11. 计算机组成原理期末考试题目及答案,计算机组成原理期末考试试题附标准答案.doc...
  12. 施工日志管理软件app_启用ERP装修管理软件的必要性
  13. oracle e18,oracle 体系结构
  14. wordpress如何压缩HTML代码
  15. Xcode6与Xcode5之间的细节差别(Precompile Prefix Header)
  16. demo VelocityTracker
  17. android指纹测试,Android指纹识别
  18. 屏幕不光只看尺寸 各材质屏幕实战解析
  19. 推荐:(链接)幽默男女--绝对搞笑!!(每日更新)
  20. 如何让android的service一直在后台运行?,保持service一直在后台运行

热门文章

  1. 亲密接触中国SaaS应用(中)
  2. C++:重载运算符“+”,用于复数加法运算。(如c1+c2,i+c1,c1+i(i为整数))
  3. python手机解释器_用Python实现一个Python解释器
  4. linux网络存储备份,备份基础:Linux异构网络共享光盘刻录(下)
  5. 小学生认识计算机网络教案,小学计算机教案
  6. Puppet应用配置的工作原理
  7. 为什么选择 Intellij IDEA 作为日常开发工具
  8. Verizon宣布完成对AOL的44亿美元收购
  9. 2021年全球干细胞收入大约2832.7百万美元,预计2028年达到5673.4百万美元,2022至2028期间,年复合增长率CAGR为11.3%
  10. java中abstract什么意思中文_ABSTRACT中文什么意思