Android 中的内存使用情况
为了让我们的应用程序受到用户的喜爱,让应用程序出名,内存起着非常重要的作用。应用程序的内存需求越少,应用程序在特定设备上的运行速度就越快。如果应用程序在入门级设备上运行,我们需要小心,我们知道大多数安卓用户使用入门级设备。这里的入门级设备意味着低成本设备。所以为了提供更好的用户体验和加强Android系统。每个优秀的 Android 开发人员都必须了解应用程序的内存使用情况。所以在这篇文章中,我们将了解android中的内存使用情况。这可能很复杂,因此我们将其分为以下步骤。
- 为什么我们要了解内存使用情况?
- 内存使用对设备有何影响?
- 减少对应用程序的内存影响。
为什么我们要了解内存使用情况?
所以在理解内存的使用之前,我们必须明白为什么我们还要关心理解内存的使用。基本上,市场上有三种类型的安卓设备。
- 入门级
- 中级
- 高级级别
在这三种类型的设备中,入门级设备的内存较低,这些设备只能运行那些需要低内存的应用程序,如果应用程序的内存使用量增加,那么入门级设备将很难运行应用程序。结果,用户将获得非常糟糕的用户体验,并且由于这种性能,他们可能会停止使用该应用程序。这也会对安卓生态系统产生不好的影响。 (即应用程序、设备和用户的集合)。
尽管这在低级设备中是一个问题,但优秀的 android 开发人员应该尽其所能使应用程序性能更好,内存使用效率更高,并减少内存使用。
内存使用对设备有何影响?
现在我们将看到高内存需求对设备的影响。一般来说,android设备的内存是分页的,每页大约4KB。页面分为三种类型
- 已用页面:这些是进程当前正在使用的页面。
- 缓存页面:这些是进程正在使用的页面,但内存的某些部分也存在于主内存中。因此,为了快速检索数据,我们使用缓存页面。
- 空闲页面:这些是空闲的页面,即这些是将来可用于存储某些内容的内存空间。
现在,让我们看看内存压力对安卓设备的影响是什么。下图显示了一段时间内的内存使用情况。因此,一开始,没有什么可运行的,但随着时间的推移,我们开始使用更多的应用程序,而随着时间的推移,这反过来又会使用越来越多的内存。
从上图中,我们可以清楚地看到,一开始,当设备开始运行时,已经有很多可用内存。但是当我们开始使用其他应用程序时,空闲内存正在被使用,并且为了避免由于内存不足而可能发生的坏事,内核执行称为 kswapd 的操作。
在 kswapd 的过程中,如果设备的内存下降到 kswapd 阈值,那么 Linux 内核将开始寻找更多的空闲内存。因此,它的作用是回收缓存的页面并使其免费。但这里的问题是,如果我们希望应用程序回收缓存页面中存在的内存,那么这将需要一些时间,因为目前缓存页面中没有任何内容,并且数据将从设备的存储中加载。
在 Android 中,有一个进程称为低内存杀手,它会从 android 设备中选择一个进程并完全杀死该进程。通过这样做,我们将取回进程正在使用的所有内存。但是,如果一个低内存杀手杀死了对用户很重要的进程呢?在 Android 中,有一个应用程序的优先级列表,当内存不足的杀手开始发挥作用时,我们会根据优先级列表删除该应用程序。以下是 Android 中的优先级列表:
每当低内存杀手发挥作用时,它将首先删除缓存的应用程序。即使在那之后,内存使用量将继续增加,并且低内存杀手将杀死以前打开的应用程序。现在,如果用户想要打开之前打开的应用程序,则启动该应用程序需要一些时间,因为它当前不存在于缓存内存中。
同样,如果内存使用量不断增加,那么主应用程序将被杀死,然后在该服务之后,可感知的、前台的和持久的应用程序将被停止或销毁。同样,如果内存使用量不断增加,那么系统应用程序将被杀死,我们的手机将重新启动🙁 这是我们在低内存设备或入门级设备中可能拥有的最糟糕的用户体验)。我们举的例子是一个 2GB 的设备。当您拥有 512MB 设备时,情况会变得更糟。
在上面给出的示例中,我们的内存非常少,因此 kswapd 和低内存杀手将很早就开始发挥作用。因此,低内存杀手将始终处于活动状态,这将导致非常糟糕的用户体验,我们应该尽最大努力开发一个能够在低内存情况下也能正常运行的应用程序。
现在我们了解了如何知道我们的应用程序对一些入门级设备的内存影响是什么,在上面的部分中,我们已经看到设备的内存被分为几个页面,Linux 内核系统跟踪特定应用程序使用的页面。
但是当应用程序开始使用一些共享内存时,情况会变得更糟。举个例子,您可以有一个调用 Google Play 服务的应用程序,这反过来会导致这两个应用程序之间的页面共享。
现在,这里出现的问题是如何处理这个共享内存。应用程序是否负责共享内存?或者 Google Play 服务对此共享内存负责?有几种不同的方法可用于处理这些情况:
- RSS(驻留集大小):在此方法中,应用程序负责我们示例中的所有共享内存,Google Play 服务无需执行任何操作,使用 Google Play 服务的应用程序将负责内存共享。
- USS(唯一共享集) :在这种方法中,应用程序不对任何共享页面负责。
- PSS(Proportional Set Size) :在这种方法中,应用程序将负责与共享共享内存的进程数成正比的页面数。就像,如果共享内存包含 4 个页面,那么内存在两个进程之间共享,应用程序将只负责两个页面。如果共享页面为 4,共享进程数将变为 3,则应用将处理 4/3 页面。
减少对应用程序的内存影响
到目前为止,我们已经看到内存使用如何对设备产生严重影响。我们看到了如何评估应用程序的内存影响。现在,我们将找到可用于减少应用程序内存影响的方法。让我们来看看如何做到这一点。减少应用程序内存影响的第一步是检查 Android Studio 的内存分析器。
这将为您提供很多信息,例如,您将了解您的Java对象、它们在哪里分配、它们持有什么,以及您可以找到的关于Java对象的几乎所有信息。找到 PSS 值,我们只考虑了Java堆。现在我们知道了内存使用的重要性。