Android-内存泄漏处理

本文介绍了Android应用中内存泄漏的检测、发生及预防方法。通过监控APP运行内存变化可检测内存泄漏,例如,如果在打开和关闭页面后内存持续增加,可能存在泄漏。内存泄漏的例子包括未移除的Runnable任务。预防措施包括关闭Cursor,重用Adapter,回收Bitmap,释放引用以及注销监听器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

内存泄漏指的是程序运行时未能正确回收部分内存,导致这些内存既不能被自身使用,又不能被其他程序使用,从而变成垃圾内存。一旦内存泄漏无法得到控制,该程序占用的内存就会越来越大,最终只能强行结束,否则会导致系统死机。

内存泄漏的检测

要对内存泄漏问题进行优化,首先得检测APP是否发生内存泄漏。正常情况下,一个APP占用的内存有一个峰值,达到这个峰值后,只要退出APP界面,占用的内存大小就会降下来。但是如果发生了内存泄漏,这个APP占用的内存大小是没有峰值的,随着页面的重复打开或时间的不断流逝,该APP消耗的内存越变越大,这便表示出现了内存泄漏的状况。因此,只要能监控APP的运行内存变化情况,即可间接判断这个APP是否发生泄漏。下面来看通过studio查看泄漏的步骤:

  1. 先通过操作产生泄漏,这时内存已经发生了泄漏

  2. 点击Profiler如图:
    Alt

  3. 下面我们手动触发GC来回收无用的内存,如图:Alt

  4. 反复的打开和关闭界面,如果发现App占用的内存只增不减,那么就是发生了内存泄漏。

内存泄漏的发生

之前讲述了如何检测发生了内存泄漏,为进一步观察内存泄漏现象,下面举个例子:
未能移除定时的Runnable任务
通常有需要延时处理时,常常调用Handler对象的postDelayed方法,由该方法延迟一段时间后执行设定好的Runnable任务。若要实现动画效果,则循环执行若干次postDelayed方法。这里蕴含着不晓得内存泄露风险,如不谨慎,App可能多跑几次就挂了。
比如下面的代码每隔两秒打一行日志,并在onDestroy页面退出时根据开关来判断是否移除任务,
代码如下:

public class RemoveTaskActivity extends AppCompatActivity implements OnClickListener{
   
   
     private CheckBox ck_remove;
     private TextView tv_remove;
     private Button btn_remove;
     private String mDesc="";
     private boolean isRunning=false; //定时任务是否在运行
     private Handler mHandler=new Handler(); //声明一个处理器对象

protected void onCreate(Bundle savedInstanceState){
   
   
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_remove_task);
     ck_remove=findViewById(R.id.ck_remove);
     tv_remove=findViewById(R.id.tv_remove);
     btn_remove=findViewById(R.id.btn_remove);
     btn_remove.setOnClickListener(this);
     TextView tv_start=findViewById(R.id.tv_start);
     tv_start.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值