51Testing软件测试论坛

标题: Android 内存泄露实践分析 [打印本页]

作者: 八戒你干嘛    时间: 2017-8-15 13:34
标题: Android 内存泄露实践分析
专项:Android内存泄露实践分析定义
​        内存泄漏也称作“存储渗漏”,用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。(其实说白了就是该内存空间使用完毕之后未回收)即所谓内存泄漏。
内存泄漏形象的比喻是“操作系统可提供给所有进程的存储空间正在被某个进程榨干”,最终结果是程序运行时间越长,占用存储空间越来越多,最终用尽全部存储空间,整个系统崩溃。所以“内存泄漏”是从操作系统的角度来看的。这里的存储空间并不是指物理内存,而是指虚拟内存大小,这个虚拟内存大小取决于磁盘交换区设定的大小。由程序申请的一块内存,如果没有任何一个指针指向它,那么这块内存就泄漏了。
​                                                                                                                                   ——来自《百度百科》
影响成效内存泄露实施后,项目的收获:
类型技巧

分析​    原理
​    根本原因
​    怎么解决
​    实践分析
方案实践(示例)Bitmap泄露
Bitmap泄露一般会泄露较多内存,视图片大小、位图而定
App启动图Activity的onDestroy()中及时回收内存
  1. @Override
  2. protected void onDestroy() {
  3.     // TODO Auto-generated method stub
  4.     super.onDestroy();
  5.     recycleImageView(imgv_load_ad);
  6.     }

  7. public static void recycleImageView(View view){
  8.         if(view==null) return;
  9.         if(view instanceof ImageView){
  10.             Drawable drawable=((ImageView) view).getDrawable();
  11.             if(drawable instanceof BitmapDrawable){
  12.                 Bitmap bmp = ((BitmapDrawable)drawable).getBitmap();
  13.                 if (bmp != null && !bmp.isRecycled()){
  14.                     ((ImageView) view).setImageBitmap(null);
  15.                     bmp.recycle();
  16.                     bmp=null;
  17.                 }
  18.             }
  19.         }
  20.     }
复制代码

IO流未关闭
  1. public static void copyFile(File source, File dest) {
  2.         FileChannel inChannel = null;
  3.         FileChannel outChannel = null;
  4.         Log.i(TAG, "source path: " + source.getAbsolutePath());
  5.         Log.i(TAG, "dest path: " + dest.getAbsolutePath());
  6.         try {
  7.             inChannel = new FileInputStream(source).getChannel();
  8.             outChannel = new FileOutputStream(dest).getChannel();
  9.             inChannel.transferTo(0, inChannel.size(), outChannel);
  10.         } catch (IOException e) {
  11.             e.printStackTrace();
  12.         }
  13.     }
复制代码





作者: 八戒你干嘛    时间: 2017-8-15 13:34
单例模式泄露
  1. ActivityUtil.getAppManager().add(this);
复制代码
持有代码:
  1. public void add(Activity activity) {
  2.       if (activityStack == null) {
  3.           synchronized (ActivityUtil.class){
  4.               if (activityStack == null) {
  5.                   activityStack = new Stack<>();
  6.               }
  7.           }
  8.       }
  9.       activityStack.add(activity);
  10.   }
复制代码

  1. @Override
  2. protected void onDestroy() {
  3.   super.onDestroy();
  4.   sm.unregisterListener(acceleromererListener,acceleromererSensor);
  5. }
复制代码


Handler泄露
handler.sendEmptyMessage(0);
  1. @Override
  2. protected void onDestroy() {
  3.   super.onDestroy();
  4.   handler.removeCallbacksAndMessages(null);
  5. }
复制代码

异步线程泄露
  1. new Thread() {
  2.   public void run() {
  3.     imageArray = loadImageFromUrl(imageUrl);
  4.   }.start();
复制代码

后面

作者: Alawn    时间: 2017-12-29 13:43
学习了




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2