内存泄漏、内存溢出
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对象,消耗内存。