Android中内存泄漏和内存溢出
2017-07-01 16:27
134 查看
内存泄漏、内存溢出 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对象,消耗内存。
相关文章推荐
- android中内存泄漏和内存溢出的区别
- Android 内存溢出和内存泄漏的区别
- Android中的内存泄漏和内存溢出问题
- Android 项目中内存泄漏和内存溢出(oom)以及常见内存问题相关Demo详解
- Android 项目中长遇见的内存泄漏和内存溢出(oom)详解
- Android中的内存溢出和内存泄漏问题
- Android内存泄漏和内存溢出(oom)的区别及解决方案
- Android 内存溢出和内存泄漏
- java/Android内存泄漏和内存溢出详解
- Android中内存泄漏和内存溢出
- Android 内存溢出和内存泄漏的问题
- Android 内存溢出和内存泄漏的区别以及造成的原因
- android端内存泄漏与内存溢出整理
- Android 内存溢出和内存泄漏的区别
- Android 内存泄漏和内存溢出
- Android 内存溢出和内存泄漏的区别
- android内存泄漏和内存溢出
- android内存泄漏,内存溢出,发生的方式以及解决办法
- [Android随笔]内存泄漏以及内存溢出
- 内存溢出和内存泄漏的区别