Android app 内存分配

在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技术问题解析,Java)