Android操作系统之内存回收策略

Android操作系统之内存回收策略

简介

Android操作系统中采用了Linux的内存管理机制,但是因为Android是一个移动设备的操作系统,而移动设备有限资源的特性决定了内存管理需要更加高效。

环境

Android操作系统中,每个应用程序拥有自己的虚拟机,也就是一个独立的运行环境。每个应用程序都可以理解为一个单独的进程(Process),该进程之间是相互独立的。这样设计的目的是为了保障各个应用程序之间的安全性和稳定性。

内存回收策略

低内存情况下的内存回收

Android操作系统中,当手机的内存不足时,系统会触发低内存回收策略。在这种情况下,系统会优先回收那些处于后台的应用程序,以释放更多的内存供正在使用的应用程序使用。当后台应用程序被回收后,其所有的资源和状态都会被清除。

进程优先级

因为Android操作系统中每个应用程序都是一个独立的进程,当内存不足时,系统也会根据进程的优先级,来判断是先回收哪些应用程序。

系统根据进程的运行情况和进程的重要性,给每个进程划分了一个相应的优先级,进程优先级共分为5个等级,如下所示:

  • 前台进程:处于前台的应用程序,比如当前用户正在使用的应用程序。
  • 可见进程:虽然用户没有直接操作该应用程序,但是该应用程序仍然处于用户能够感知到的状态,比如用户在使用另一个应用程序时,该应用程序的Notification在状态栏中显示。
  • 服务进程:正在执行服务的进程。
  • 后台进程:已经被暂停的应用程序,但是进程仍然在运行。
  • 空进程:系统中没有任何运行组件的进程。

根据不同的进程优先级,系统会进行不同的内存回收操作。具体操作如下:

  • 当内存不足时,系统会优先回收后台进程和空进程。
  • 当内存紧张时,系统会回收后台进程、服务进程和可见进程。因为这些进程对于用户并没有直接的体验,所以对于终端用户而言,回收这些进程并不会对用户的体验产生较大的影响。
  • 当内存非常紧张时,系统会回收所有的后台进程、服务进程和可见进程,甚至包括前台进程。因为内存不足,如果系统不进行全面回收,很容易导致系统奔溃。

单个应用程序的内存回收

在某个应用程序的内存使用过程中,如果应用程序使用的内存超出了系统分配给该应用程序的上限,系统会强制回收该应用程序的一些内存资源。

具体的回收策略如下:

  • 从内存使用率最高的Activity开始回收。
  • 回收该Activity的View中所绑定的资源。
  • 回收该Activity中以后不会使用的对象所占用的资源。
  • 如果以上三步回收后,还未达到系统规定的内存限制,系统会继续回收内存使用率第二高的Activity中所绑定的资源和内存空间。

对内存回收的建议

为了避免系统过度消耗内存,从而影响其他应用程序的运行效率和性能,给用户带来不好的体验,我们在应用程序的开发过程中,应该根据Android内存管理机制的特点,给出以下建议:

  • 进行数据的及时回收,避免数据在内存中占据较大的空间。
  • 采用懒加载机制,在需要的时候再去加载需要的资源和数据。
  • 避免在Activity中创建过多的对象,应该尽量使用Application来创建共享资源。
  • 降低Bitmap的分辨率,减少Bitmap占用内存的大小。
  • 优化ListView的重用机制,在列表滚动时对不显示的Item进行回收和复用。
  • 采用内存缓存机制,对常用资源进行缓存。

示例

下面是一段代码的示例,每隔1秒钟向ImageView中加载一张图片,当内存不足时,系统会强制回收资源。

public class MainActivity extends AppCompatActivity {

    private ImageView mImageView;

    private int[] mImageIds = {R.drawable.img1, R.drawable.img2, R.drawable.img3, R.drawable.img4};

    private int mCurrentIndex = 0;

    private Handler mHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mImageView = (ImageView) findViewById(R.id.image_view);

        mHandler = new Handler();

        mRunnable.run();
    }

    private Runnable mRunnable = new Runnable() {
        @Override
        public void run() {
            mImageView.setImageResource(mImageIds[mCurrentIndex]);
            mCurrentIndex++;

            if (mCurrentIndex >= mImageIds.length) {
                mCurrentIndex = 0;
            }

            mHandler.postDelayed(mRunnable, 1000);
        }
    };
}

这段代码中,当内存不足时,系统会优先回收后台进程和空进程,如果系统内存仍不够用,则会回收该应用程序中最占用内存的Activity所绑定的资源。

结论

Android内存管理机制是非常重要的一部分,合理地使用内存管理机制可以有效地提高应用程序的性能和稳定性。为了避免系统过度消耗内存,从而影响其他应用程序的运行效率和性能,我们在应用程序的开发过程中,应该根据Android内存管理机制的特点,进行相应的优化,以提高应用程序的用户体验。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android操作系统之内存回收策略 - Python技术站

(0)
上一篇 2023年5月24日
下一篇 2023年5月24日

相关文章

  • [Linux] deepin系统添加PHP仓库源出错Error: could not find a distribution template for Deepin/stable

    aptsources.distro.NoDistroTemplateException: Error: could not find a distribution template for Deepin/stable 网上的答案是修改系统的版本信息/etc/lsb-release DISTRIB_ID=UbuntuDISTRIB_RELEASE=18.04D…

    Linux 2023年4月13日
    00
  • linux系统下php安装mbstring扩展的二种方法

    下面是详细讲解“Linux系统下PHP安装mbstring扩展的二种方法”的攻略: 方法一:通过源码安装 下载PHP源码,并解压缩到指定目录。 $ tar -zxvf php-7.4.12.tar.gz //解压PHP源码包 进入源码目录,执行configure配置脚本。 $ cd php-7.4.12 $ ./configure –prefix=/usr…

    Linux 2023年5月14日
    00
  • Apache配置技巧

    以下是“Apache配置技巧”的完整使用攻略,包含两个示例说明。 Apache配置技巧 以下是一些Apache配置技巧,可以帮助您更好地配置和管理Apache服务器。 1. 配置虚拟主机 虚拟主机允许在同一台服务器上托管多个网站。是配置虚拟主机的示例: 打开Apache服务器配置文件: bash sudo nano /etc/httpd/conf/httpd…

    Linux 2023年5月13日
    00
  • Linux中QQ软件的安装和配置

    当然可以,以下是“Linux中QQ软件的安装和配置”的完整攻略,希望能对你有所帮助。 安装Wine 在Linux系统中安装QQ需要安装Windows模拟器Wine,执行以下命令安装: sudo apt install wine 安装完成后可以通过以下命令查看Wine的版本信息: wine –version 下载QQ安装程序 有些不正经的第三方网站提供了QQ…

    Linux 2023年5月14日
    00
  • Linux系统中关于KVM虚拟机迁移的一些相关问题

    关于Linux系统中关于KVM虚拟机迁移的一些相关问题,一些常见问题和解决方案请见下文。 1. KVM虚拟机迁移的介绍 KVM是一种开源虚拟化技术,它支持基于硬件的虚拟化,也支持容器技术。虚拟机迁移是指将正在运行的虚拟机从一个物理主机迁移到另一个物理主机。在KVM中,虚拟机迁移有两种方式,即冷迁移(Shut down)和热迁移(Live migration)…

    Linux 2023年5月24日
    00
  • linux环境编程(1): 实现一个单元测试框架

    写在前面 在开发的过程中,大多数人都需要对代码进行测试。目前对于c/c++项目,可以采用google的gtest框架,除此之外在github上搜索之后可以发现很多其他类似功能的项目。但把别人的轮子直接拿来用,终究比不过自己造一个同样功能的轮子更有成就感。作为“linux环境编程”系列文章的第一篇,本篇文章记录了如何用较少的代码实现一个可用的单元测试框架,这个…

    Linux 2023年4月11日
    00
  • aix系统如何查看网卡配置

    在AIX系统中,查看网卡配置可以使用entstat和lsdev命令来实现。 使用entstat命令查看网卡配置 使用以下命令查看所有网卡的信息: entstat -all 使用以下命令查看指定网卡的信息: entstat -d enX 其中enX代表网卡的名称,例如en0表示第一块网卡,en1表示第二块网卡,以此类推。 使用lsdev命令查看网卡配置 使用以…

    Linux 2023年4月17日
    00
  • docker部署蜗牛影院系统详细流程分析

    以下是docker部署蜗牛影院系统的详细攻略。 1. 安装docker 如果您已经安装了docker,请跳过此步骤。 通过以下命令安装docker: Ubuntu $ sudo apt-get update $ sudo apt-get install docker.io -y CentOS $ sudo yum update $ sudo yum inst…

    Linux 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部