Android中内存泄漏和内存溢出

内存泄漏、内存溢出

    Android为不同类型的进程分配了不同的内存使用上限,如果程序在运行过程中占用的内存大小超过系统分配的内存,则这时候会出现内存溢出;

Android应用在运行过程中如果所引用的系统资源或者对象资源使用完毕后没有及时回收和释放或者进程在运行过程中一点点积累的内存超出了系统分配的内存大小,这时候就会出现内存泄漏;

  内存溢出必然会导致内存泄漏,但是内存泄漏并不一定是内存溢出导致的!不管是内存泄漏还是内存溢出,都会被系统kill掉,自己的进程就结束运行,但不会影响其他的进程。

比如以下几种情况:

1、 创建的Bitmap对象未回收

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       

        ImageView iv=new ImageView(this);
        setContentView(iv);

        Bitmap bitmap=null;
        try{
            bitmap=Bitmap.createBitmap(200,200, Bitmap.Config.ALPHA_8);
            iv.setImageBitmap(bitmap);
        }catch (Exception e){
            e.printStackTrace();
        }
        finally {
            //此处必须进行Bitmap及时回收,或者放进缓存中,因为在进行多次点击之后会出现内存溢出

                try {
                    if (bitmap != null) {
                        bitmap.recycle();//回收
                    }
                }catch (Exception e) {
                    e.printStackTrace();
                }
            }
	}
    }
	2、注册的广播未及时取消注册
	
public class MainActivity extends AppCompatActivity {

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

         broadcastReceiver=new MyBroadcastReceiver();
        IntentFilter filter=new IntentFilter("com.gao.ACTION");//com.gao.Action AndroidManifest.xml注册
        LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, filter);

    }
    class MyBroadcastReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context,"ok",Toast.LENGTH_LONG).show();
        }
    }

    @Override
    protected void onDestroy() {  //或者在onStop()中注销也行
        LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver);//此处必须注销广播
        super.onDestroy();
    }
}
	2.布局层级过深,在layout中
<LinearLayout
    <LinearLayout
        <LinearLayout
            //布局层数最多不超过三层
        </LinearLayout>
    </LinearLayout>
</LinearLayout>
3.当资源引用完毕后未关闭IO流
public class MainActivity extends AppCompatActivity {

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

        FileOutputStream fos=null;
        ObjectOutput oos=null;

        try {
            File f=new File("/User/Desktop/test.txt");

            File sdCardDir= Environment.getExternalStorageDirectory();//获取SD卡目录
            File sdFile=new File(sdCardDir,"out.txt");

            fos=new FileOutputStream(f);
            oos=new ObjectOutputStream(fos);
            oos.writeObject(f);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //此处必须关闭IO            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                oos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
	4.static 对象在使用完毕后未及时关闭
	同上,在覆写onDestory()方法下,令static 对象等于null;
	5.String 和stringBuffer的使用
	String 每次拼接使用“+”号,未使用StringBuffer,每次都会重新创建String对象,消耗内存。

	
	
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值