Android知识Android技术知识Android开发

Android内存管理及优化

2016-10-25  本文已影响454人  吾若成疯

Random Access Memory(RAM)在任何软件开发环境中都是非常重要的资源,但在物理内存通常很有限的移动操作系统上更为重要。尽管Android Runtime (ART)和Dalvik虚拟机扮演了垃圾回收的角色,但这并不意味着我们可以忽略应用的内存分配与释放的时机和位置。我们也需要避免引入Memory Leaks(内存泄漏,通常由于在Gm需要回收一些释放对象时扔持有对象引用在静态成员变量里,在释放一些引用对象在需要回收时)。

本文会解释Android是如何管理应用的内存分配,以及在开发Android应用的时候如何主动的减少内存的使用。

1、Android是如何管理内存的

Android的运行时(ART)和Dalvik虚拟机使用分页和内存映射(mmapping)来管理内存。这意味着,一个应用程序的任何内存修改,不管是通过分配新的对象还是触摸mmapped页,仍驻留在内存中,不能被调出。从应用程序释放内存的唯一方法是释放应用所持有的引用对象,使内存可用于垃圾收集器。有一个例外:没有修改mmapped中的任何文件,如代码,在系统在其他地方需要使用该内存时被换出RAM。

1. Garbage collection(垃圾回收)
一个管理内存的环境,如ART或Dalvik虚拟机,跟踪每一个内存分配。一旦它确定一块存储器不再被使用的程序,它释放回堆,不需要开发者的任何干预。对于托管内存环境中回收未使用的内存的机制被称为Garbage collection(垃圾回收)垃圾回收有两个目标:找到程序里未来不能被访问的对象并回收这些对象所使用的资源。

2.shared memory(共享内存)
为了适应在RAM中需要的一切,Android尝试共享跨进程内存的pages。它可以通过以下方式做到:

3.分配和回收应用内存
每一个应用进程的Dalvik 都与一个虚拟的内存范围(heapSize)。这定义了一个了了逻辑堆的大小(heapSize),它可以随着需要增长至系统为每个应用设定的大小限制。

heapSize和实际物理上的内存数量是不等的。当检查app的堆时,Android会计算Proportional Set Size(PSS)的值,PSS是实际共享的内存大小,记录了那些和其他进程进行共享的内存。

Dalvik堆和逻辑堆得大小(heapSize)并不吻合,这意味着Android并没有使用碎片处理去关闭空闲区域。Android只有当堆末端有没用的空间时才能收缩逻辑堆大小(heapsize),但系统仍然可以减少堆所占用的物理内存大小。在垃圾回收之后,Dalvik会遍历heap并找出不使用的pages,然后使用madvise把那些pages返回给kernal。因此,成对的allocations与deallocations大块的数据可以使得物理内存能够被正常的回收。然而,回收碎片化的内存则会使得效率低下很多,因为那些碎片化的分配页面也许会被其他地方所共享到。

4. 限制应用的内存

为了维持多任务的功能环境,Android为每一个app都设置了一个硬性的heap size限制。确切的heapsize限制随着设备可用的RAM大小而有差异,如果app的heapSize已经达到了最大限制而尝试分配更多的内存就会引起OutOfMemoryError

如果想要查询当前设备的heap size限制大小是多少,然后决定cache的大小。可以通过 getMemoryClass()来查询。这个方法会返回一个整数,表明你的app heap size限制是多少。
也可以通过手机目录system>build.prop文件查看

5、切换应用

当用户切换两个应用时,Android会把那些不是前台的应用()放在 least-recently used (LRU)cache里。比如说当用户第一次启动app时,系统就会为他创建一个进程,但是当用户退出应用是,之前创建的进程并没有退出,系统将进程缓存起来,当用户再返回到应用时,系统就会重用这个进程,这样会让应用切换的更快。

如果你的应用有一个被缓存的进程,虽然它没有被使用,但它仍被保留在内存中,这会影响系统的整体性能。当系统开始进入低内存状态时,它会杀掉Lrucache中最近使用最低的进程,系统也会把进程所占用的内存进行释放。

2、应用如何管理内存

一些Android特性、Java类和代码结构倾向于使用更多的内存。我们可以通过提高代码的效率来减少应用程序对内存的使用

当我们启动一个服务时,系统会倾向于一直保持服务所在的Process,这使得Service所在的Process非常浪费,因为系统没法把Service里所占用的没有用的RAM给其他的Process,这减少了系统能够缓存的进程的数量,使应用间的切换更加低效。它甚至会导致系统内存不稳定,不能够维持正在运行的服务。

一般情况下应该尽量少使用持久性的Service,因为它一直需要占用内存。谷歌推荐我们使用 JobSchedulerIntentService(当处理完Intent后会自动停止)。

原文链接:
https://developer.android.com/topic/performance/memory.html
https://developer.android.com/topic/performance/memory-overview.html

上一篇 下一篇

猜你喜欢

热点阅读