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

yizhihongxing

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 双网卡配置两个IP同时只有一个会通的原因

    http://blog.csdn.net/centerpoint/article/details/38542719   根本原因: Linux默认启用了反向路由检查 如果2个网卡在一个Lan里面,那么服务器可能从eth0或者eth1发现网关, 如果一个包从eth0进入了, 而网关在eth1上, 那么从eth1是出不去的, 就不通了.  反向路由检查要求从哪里…

    Linux 2023年4月16日
    00
  • 小白教程! Linux服务器上JDK安装配置方法

    小白教程!Linux服务器上JDK安装配置方法 在Linux服务器上安装Java Development kit (JDK)是很重要的一步,因为Java是许多应用程序开发和运营所依赖的基本环境。本文将介绍在Linux平台上安装和配置JDK的方法。 步骤一:下载JDK 前往Oracle官网下载JDK:https://www.oracle.com/java/te…

    Linux 2023年5月14日
    00
  • Linux中如何让命令在后台运行

    1.在下达的命令后面加上&,就可以使该命令在后台进行工作,这样做最大的好处就是不怕被ctrl+c这个中断指令所中断。 2. 那大家可能又要问了,在后台执行的程序怎么使它恢复到前台来运行呢?很简单,只用执行fg这个命令,就可以了。 3.可能有些同学又要问了,我现在已经在前台运行的命令,我能把它放到后台去运行么?当然可以了,只要执行ctrl+z就可以做到…

    Linux 2023年4月15日
    00
  • linux系统下的/proc目录介绍

    1. /proc目录 Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。 用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,…

    Linux 2023年4月13日
    00
  • 004_linux驱动之_class_create创建一个设备类

    (一)解析:class_create函数和class_destroy函数     创建一个类         和        删除一个类。   (二)class_create函数原型   struct class *class_create(struct module *owner, const char *name);   1. 查看函数注释: / * …

    Linux 2023年4月11日
    00
  • Linux漏洞扫描工具lynis使用方法解析

    Linux漏洞扫描工具lynis使用方法解析 简介 lynis 是一款用于 Linux 操作系统的强大安全审计和漏洞扫描工具,可以帮助管理员轻松发现系统中的安全漏洞和隐患,并采取有效的措施来解决这些问题。本文将详细介绍 lynis 的使用方法。 安装 在 Ubuntu 和 Debian 系统中,您可以使用以下命令来安装 lynis: $ sudo apt-g…

    Linux 2023年5月14日
    00
  • Linux命令之lz4命令使用示例

    Linux命令之lz4命令使用示例 lz4命令简介 lz4是LZ4压缩算法的命令行实现,可以对单个文件或目录进行压缩和解压缩操作。LZ4是一个快速轻量级的压缩算法,有着非常快的压缩和解压缩速度和可扩展性。 lz4命令格式 lz4 [OPTION]… [FILE]… lz4命令常用选项 选项 描述 -c, –stdout 将压缩后的内容输出到stdo…

    Linux 2023年5月14日
    00
  • vmware虚拟机ubuntu18.04安装教程

    VMware虚拟机Ubuntu18.04安装教程 简介 本教程旨在为初学者介绍如何在VMware虚拟机上安装Ubuntu 18.04操作系统。VMware是一种虚拟化软件,允许在一台计算机上运行多个操作系统。Ubuntu是一个流行的Linux发行版,具有丰富的资源和社区支持,是程序员、开发人员和科学家等多种用户的首选操作系统之一。 步骤 第一步:下载VMwa…

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