十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
内存溢出是指当对象的内存占用已经超出分配内存的空间大小,这时未经处理的异常就会抛出。比如常见的内存溢出情况有:bitmap过大;引用没释放;资源对象没关闭
创新互联是一家集网站建设,望花企业网站建设,望花品牌网站建设,网站定制,望花网站建设报价,网络营销,网络优化,望花网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
如图,这是常见的bitma对象的溢出,显示像素过高或图片尺寸远远大于显示空间的尺寸时,通常都要将其缩放,减小占用内存。
内存泄漏(memory
leak)
有些对象只有有限的生命周期。当它们的任务完成之后,它们将被垃圾回收。如果在对象的生命周期本该结束的时候,这个对象还被一系列的引用,这就会导致内存泄漏。随着泄漏的累积,app将消耗完内存。
比如,在Activity.onDestroy()被调用之后,view树以及相关的bitmap都应该被垃圾回收。如果一个正在运行的后台线程继续持有这个Activity的引用,那么相关的内存将不会被回收,这最终将导致OutOfMemoryError崩溃。
memory
leak会最终会导致out
of
memory!
如图,这是使用MAT工具查找内存泄漏的结果,例子是
handle
延时发送
message
而在关闭
activity
后
context
被销毁所引发的泄漏,这是作为目的性的测试所以问题比较容易找到,在实际开发中内存泄漏不易察觉并难以找到,当泄漏累积到一定程度是会引发
OOM
的。
Android虽然会自动管理内存,JAVA也有garbage collection (GC )内存回收机制。但是如果程序在一次操作中打开几个M的文件,那么通常会出现下面的错误信息。02-04 21:46:08.703: ERROR/dalvikvm-heap(2429): 1920000-byte external allocation too large for this process.
或
02-04 21:52:28.463: ERROR/AndroidRuntime(2429): java.lang.OutOfMemoryError: bitmap size exceeds VM budget移动终端因为内存有限,往往图片处理经常出现上述的错误。解决方法:1.明确调用System.gc(); 这种内存回收会有一定的作用,但是请不要太期待。2.图片处理完成后回收内存。 请在调用BitMap进行图片处理后进行内存回收。 bitmap.recycle(); 这样会把刚刚用过的图片占用的内存释放。3.图片处理时指定大小。 下面这个方法处理几个M的图片时是必须的BitMap getBitpMap(){ ParcelFileDescriptor pfd; try{ pfd = mCon.getContentResolver().openFileDescriptor(uri, "r"); }catch (IOException ex){ return null; } java.io.FileDescriptor fd = pfd.getFileDescriptor(); BitmapFactory.Options options = new BitmapFactory.Options(); //先指定原始大小 options.inSampleSize = 1; //只进行大小判断 options.inJustDecodeBounds = true; //调用此方法得到options得到图片的大小 BitmapFactory.decodeFileDescriptor(fd, null, options); //我们的目标是在800pixel的画面上显示。 //所以需要调用computeSampleSize得到图片缩放的比例 options.inSampleSize = computeSampleSize(options, 800); //OK,我们得到了缩放的比例,现在开始正式读入BitMap数据 options.inJustDecodeBounds = false; options.inDither = false; options.inPreferredConfig = Bitmap.Config.ARGB_8888; //根据options参数,减少所需要的内存 Bitmap sourceBitmap = BitmapFactory.decodeFileDescriptor(fd, null, options); return sourceBitmap; } //这个函数会对图片的大小进行判断,并得到合适的缩放比例,比如2即1/2,3即1/3 static int computeSampleSize(BitmapFactory.Options options, int target) { int w = options.outWidth; int h = options.outHeight; int candidateW = w / target; int candidateH = h / target; int candidate = Math.max(candidateW, candidateH); if (candidate == 0) return 1; if (candidate 1) { if ((w target) (w / candidate) target) candidate -= 1; } if (candidate 1) { if ((h target) (h / candidate) target) candidate -= 1; } if (VERBOSE) Log.v(TAG, "for w/h " + w + "/" + h + " returning " + candidate + "(" + (w/candidate) + " / " + (h/candidate)); return candidate; }
现在App开发时很多界面都是使用H5进行展示,但是在加载H5页面的过程中,如果要展示的界面中图片过多就会出现内存过多的问题,并且在退出界面后,即使在Activity的onDestory中执行了webView.destory()或者webview = null,对内存回收也没有效果。
针对上面的问题采取以下方案:
Webview时加载H5界面时,使用新进程加载,退出界面时将进程杀掉。
开启新的Activity时,在Android的清单文件中进行标记这个Activity在一个单独的进程
在这个Activity中的onDestory中,杀掉进程
执行之后,内存释放会特别明显,但是由于通过进程来处理页面,会引起当前页面和其它页面间的通信发生问题,如果需要进行通信,要注意进程间通信问题 。