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日

相关文章

  • 在Ubuntu中如何查看网络路由表详解

    在Ubuntu中查看网络路由表,有多种方法和命令可供使用。下面我将针对其中两种常用的方法进行详细的说明和示例演示。 方法一:通过命令行查看路由表 首先,打开Ubuntu的终端,可以使用快捷键Ctrl + Alt + T或点击左上角的应用程序菜单进入终端; 使用命令route -n查看当前系统的路由表,其中-n选项表示使用数字格式显示网络地址(不显示域名); …

    Linux 2023年5月24日
    00
  • Linux下nginx部署

    启动多个,请看:在linux系统下安装两个nginx以及启动 查看nginx包路径:http://nginx.org/download/,两种下载方式: ①在官网下载使用Xftp上传到linux上 ②在版本上选好,直接命令下载,如下:(下载nginx-1.20.1.tar.gz版本)建议到home目录执行该命令,方便找到 wget http://nginx.…

    Linux 2023年4月12日
    00
  • SATA Mode:Optane without Raid导致lsblk检测不到磁盘

        本人是Win(WD 512G)+ Fedora(Lexar 256G),在Fedora Linux中无法显示Windows的硬盘,但Fedora是自带NTFS驱动的,不存在文件系统不兼容。        (实际上影响不止于此,安装ubuntu会提示请关闭Raid功能,安装CentOS/deepin会完全检测不到任何硬盘,导致无法安装。本人当初无法解决…

    Linux 2023年4月17日
    00
  • 阿里云 CentOS7.4 安装 Python3.6的方法讲解

    以下是“阿里云CentOS7.4安装Python3.6的方法讲解”的完整攻略。 准备工作 在安装Python3.6之前,需要做以下准备工作: 首先要确保CentOS 7.4操作系统已经安装完毕,并且系统处于最新的状态。可以使用以下命令更新系统: sudo yum update 安装必要的依赖包: sudo yum install zlib-devel bzi…

    Linux 2023年5月14日
    00
  • VMware与Centos系统安装之重置root密码的方法

    VMware与CentOS系统安装之重置root密码的方法 当忘记CentOS系统的root密码时,可以通过以下步骤重置root密码,以便您可以重新访问系统。 步骤1:在VMware中开启虚拟机 在VMware软件中选择需要重置密码的CentOS虚拟机并启动。 步骤2:在grub选项中选择edit模式 当虚拟机启动后,进入grub选项页面。在这里您将看到Ce…

    Linux 2023年5月24日
    00
  • CentOS平台快速搭建LAMP环境的方法

    安装Apache CentOS 7默认仓库中已集成了Apache2.4。我们可以使用此命令来进行安装: sudo yum install httpd 安装成功后,可以使用以下命令启动、停止和重启Apache服务: sudo systemctl start httpd.service sudo systemctl stop httpd.service sudo…

    Linux 2023年5月14日
    00
  • linux虚拟机网络配置与网络配置常用命令使用介绍

    Linux虚拟机网络配置与网络配置常用命令使用介绍 在Linux虚拟机上,网络配置是一项非常重要的任务。本篇攻略将介绍Linux虚拟机网络配置的步骤和常用命令的使用方法。 一、虚拟机网络配置 在虚拟机网络配置中,有三种常见的网络模式:桥接模式、NAT模式和仅主机模式。 1. 桥接模式 桥接模式可以让虚拟机和主机在同一网络中。具体步骤如下: 打开虚拟机软件,选…

    Linux 2023年5月24日
    00
  • Linux下重启JBoss进程的脚本

    2010-10-09 10:12:23|  分类: Linux 订阅     版本一,还不知道pgrep命令时:#!/bin/bash echo “–>1 kill old process start…,PID=”$(ps -ef | grep “jboss-server” | grep “java” | awk ‘{print $2}’)kil…

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