在Android app的开发过程中,我们经常会遇到内存泄漏的异常,那么搞清楚每个应用程序在Android系统中最多可分配多少内存空间是十分重要的。

1、APP默认分配内存大小

google原生OS的默认值是16M,但是各个厂家定制自己的OS时,会对这个值进行修改.
google 原生OS:

gDvm.heapSizeStart = 2 * 1024 * 1024; // heap初始化大小为2M
gDvm.heapSizeMax = 16 * 1024 * 1024; // 最大的heap为16M

运行如下代码:

Runtime runtime =Runtime.getRuntime();
long maxMemory=runtime .maxMemory();
log. ("maxMemory:",Long.toString(maxMemory/(1024*1024)));

可以直接计算出当前app的最大获取内存。
实测三星s7(Android 6.0.1)、三星S6edg(Android 6.0.1):
(1)未设定属性android:largeheap = “true”时,可以申请到的最大内存空间为256M。
(2)设定属性android:largeheap = “true”时, 可以申请的最大内存空间为512M,是原来的两倍。
三星S4(android 4.3)(android 5.0):
(1)未设定属性android:largeheap = “true”时,可以申请到的最大内存空间为128M。
(2)设定属性android:largeheap = “true”时, 可以申请的最大内存空间为512M。
可见实际的app的最大内存和手机的硬件设备有关。

  

2、Android的GC如何回收内存

Android的一个应用程序的内存泄露对别的应用程序影响不大。为了能够使得Android应用程序安全且快速的运行,Android的每个应用程序都会使用一个专有的Dalvik虚拟机实例来运行,它是由Zygote服务进程孵化出来的,也就是说每个应用程序都是在属于自己的进程中运行的。Android为不同类型的进程分配了不同的内存使用上限,如果程序在运行过程中出现了内存泄漏的而造成应用进程使用的内存超过了这个上限,则会被系统视为内存泄漏,从而被kill掉,这使得仅仅自己的进程被kill掉,而不会影响其他进程(如果是system_process等系统进程出问题的话,则会引起系统重启)。

3、查看应用内存使用情况

  下面我们看看如何在开发过程中查看我们程序运行时内存使用情况。我们可以通过ADB的一个命令查看:
  
//$package_name:应用包名
//$pid:应用进程ID,可以用PS命令查看:关于ps命令查看PID

  adb shell dumpsys meminfo $package_name or $pid

注* 命令中“$”需要去掉,具体见下图:

Naitve Heap Size: 从mallinfo usmblks获得,代表最大总共分配空间

Native Heap Alloc: 从mallinfo uorblks获得,总共分配空间

Native Heap Free: 从mallinfo fordblks获得,代表总共剩余空间

Native Heap Size 约等于Native Heap Alloc + Native Heap Free

mallinfo是一个C库, mallinfo 函数提供了各种各样的通过C的malloc()函数分配的内存的统计信息。

Dalvik Heap Size:从Runtime totalMemory()获得,Dalvik Heap总共的内存大小。

Dalvik Heap Alloc: Runtime totalMemory()-freeMemory() ,Dalvik Heap分配的内存大小。

Dalvik Heap Free:从Runtime freeMemory()获得,Dalvik Heap剩余的内存大小。

Dalvik Heap Size 约等于Dalvik Heap Alloc + Dalvik Heap Free

OtherPss, include Cursor,Ashmem, Other Dev, .so mmap, .jar mmap, .apk mmap, .ttf mmap, .dex mmap, Other mmap, Unkown统计信息都可以在process的smap文件看到。

Objects and SQL 信息都是从Android Debug信息中获得。

其他类型 smap 路径名称 描述

Cursor /dev/ashmem/Cursor Cursor消耗的内存(KB)

Ashmem /dev/ashmem 匿名共享内存用来提供共享内存通过分配一个多个进程

可以共享的带名称的内存块

Other dev /dev/ 内部driver占用的在 “Other dev”

.so mmap .so C 库代码占用的内存

.jar mmap .jar Java 文件代码占用的内存

.apk mmap .apk apk代码占用的内存

.ttf mmap .ttf ttf 文件代码占用的内存

.dex mmap .dex Dex 文件代码占用的内存

Other mmap 其他文件占用的内存

图中各项的具体含义见这里

如有疑问欢迎大家留言指正。祝大家生活愉快。

最后欢迎对Android开发感兴趣的老哥一起讨论。



  

Android app 内存分配相关推荐

  1. Android的内存分配与回收

    想写一篇关于android的内存分配和回收文章的想法来源于追查一个魅族手机图片滑动卡顿问题,我们想了很多办法还是没有避免他不停的GC,所以就打算详细的看看内存分配和GC的原理,为什么会不断的GC,GC ...

  2. android 多图片优化工具,总结Android App内存优化之图片优化

    前言 在Android设备内存动不动就上G的情况下,的确没有必要去太在意APP对Android系统内存的消耗,但在实际工作中我做的是教育类的小学APP,APP中的按钮.背景.动画变换基本上全是图片,在 ...

  3. Android App内存泄露测试方法总结

    和你一起终身学习,这里是程序员Android 经典好文推荐,通过阅读本文,您将收获以下知识点: 一.内存泄露 二. Android的GC机制 三.为什么会内存泄露 四. 系统级别的内存管理 五.内存抖 ...

  4. linux ion 分配地址,Android ION内存分配

    ION设计的目标 为了避免内存碎片化,或者为一些有着特殊内存需求的硬件,比如GPUs.display controller以及camera等,在系统启动的时候,会为他们预留一些memory pools ...

  5. android内存地址分配,Android ION内存分配

    ION设计的目标 为了避免内存碎片化,或者者为少量有着特殊内存需求的硬件,比方GPUs.display controller以及camera等,在系统启动的时候,会为他们预留少量memory pool ...

  6. android 手机内存分配,Android手机内存不足,你应该这样做,被震到

    1. 正确退出程序,及时清理内存 程序运行完毕后,按返回或HOME键并不是关闭程序,只是将其切换到后台,程序其实还在运行,占用CPU又占用内存,不关闭,既费电又拖慢手机速度.我们一定要用后及时将其关闭 ...

  7. Android App内存优化之图片优化

    不要将Button的背景设置为selector   在布局文件和代码中,都可以为Button设置background为selector,这样方便实现按钮的正反选效果,但实际跟踪发现,如果是将Butto ...

  8. Android App性能优化之内存优化

    为什么要进行内存优化? 1.App运行内存限制,OOM导致App崩溃 2.App性能:流畅性.响应速度和用户体验 Android的内存管理方式 Android系统内存分配与回收方式 ●   一个App ...

  9. Android中App可分配内存的大小

    现在真实测试结果: 1,为了搞清楚每个应用程序在Android系统中最多可分配多少内存空间,我们使用了真机进行测试,测试机型为魅族MX4 Pro,3G内存. 测试方法是直接申请一块较大的内存空间,看应 ...

最新文章

  1. mysql 5.7.22初始密码_mysql5.7.22安装
  2. 【caffe解读】 caffe从数学公式到代码实现4-认识caffe自带的7大loss
  3. Linq的简介和基础知识学习
  4. gpg加解密软件学习
  5. 前端学习(931):三大系列总结
  6. mgg mysql_mgg文件怎么转换mp3格式?
  7. C++ new一个数组时,指针移动程序崩溃问题
  8. centos8 用u盘安装失败_CentOS8 的安装过程
  9. Django 模板系统
  10. MFC基础教程之窗口定义(一)
  11. 让Office 2003与Office 2010完美共存
  12. SQLHelper类方法介绍及简单使用
  13. 深度学习标签制作简易Python代码
  14. 【论文笔记】Revisiting graph based collaborative Filtering:一种线性残差图图卷积网络方法
  15. 【第3章】局域网概述
  16. 《黑客大曝光:移动应用安全揭秘及防护措施》一2.1 基础移动网络功能
  17. PHP + elasticsearch的使用方法,PHP使用ES的超级简单方法
  18. DANN loss/acc振荡
  19. 宝塔搭建chevereto图床
  20. 64位win7旗舰版安装Microsoft Office Visio时报错

热门文章

  1. 为什么大型网站前端使用PHP,后台逻辑却用Java?
  2. 杭州都有哪些靠谱点的互联网公司?
  3. java List取随机几个数据的方法实现
  4. sudo,,sudo-i ,,su的区别
  5. WinRAR(5.70)去广告
  6. 【markdown】【xSliders | slidev | mindshow】markdown文档生成PPT/视频
  7. CAS算法-实现原理
  8. 音视频学习-h264的NALU结构分析
  9. 通过面试思考平时的学习
  10. 超分辨率(CVPR2020) ~《Video Super-resolution with Temporal Group Attention》