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技术站