Android应用程序都会默认分配一定的内存空间,有些应用如果没有控制好内存的使用,就会造成内存溢出。
http://hubingforever.blog.163.com/blog/static/171040579201212414542373/
点击打开链接
如何查看自己手机堆空间大小:
1.连上手机adb shell
2.getprop dalvik.vm.heapsize
现在手机内存都比较大,4G 384M 6G 512M
我自己应用中测试,长截屏达到25页时,会发生内存溢出,导致图片保存缓慢。
07-11 09:41:03.952 29009 30246 E AndroidRuntime: java.lang.OutOfMemoryError: Failed to allocate a 218311212 byte allocation with 1048576 free bytes and 190MB until OOM 07-11 09:41:03.952 29009 30246 E AndroidRuntime: at dalvik.system.VMRuntime.newNonMovableArray(Native Method) 07-11 09:41:03.952 29009 30246 E AndroidRuntime: at android.graphics.Bitmap.nativeCreate(Native Method) 07-11 09:41:03.952 29009 30246 E AndroidRuntime: at android.graphics.Bitmap.createBitmap(Bitmap.java:879) 07-11 09:41:03.952 29009 30246 E AndroidRuntime: at android.graphics.Bitmap.createBitmap(Bitmap.java:856) 07-11 09:41:03.952 29009 30246 E AndroidRuntime: at android.graphics.Bitmap.createBitmap(Bitmap.java:823) 07-11 09:41:03.952 29009 30246 E AndroidRuntime: at com.gionee.longscreenshot.ScreenShotService.cutAndComposeFinalBitmap(ScreenShotService.java:1054) 07-11 09:41:03.952 29009 30246 E AndroidRuntime: at com.gionee.longscreenshot.ScreenShotService.-wrap0(ScreenShotService.java) 07-11 09:41:03.952 29009 30246 E AndroidRuntime: at com.gionee.longscreenshot.ScreenShotService$SavePictureThread.run(ScreenShotService.java:765)bitmap等消耗资源的类的使用中要注意回收,处理内存溢出
/** * 返回一个不可变的源位图的位图的子集,改变了可选的矩阵。新的位图可能与源相同的对象,或可能是一个副本。它初始化与原始位图的密度。如果源位图是不可变的 * ,请求的子集是一样的源位图本身,然后返回源位图,没有新的位图创建。<br> * 方 法 名:createBitmap <br> * 创 建 人: <br> * 创建时间:2016-6-7 上午11:14:24 <br> * 修 改 人: <br> * 修改日期: <br> * @param source 产生子位图的源位图 * @param x 子位图第一个像素在源位图的X坐标 * @param y 子位图第一个像素在源位图的y坐标 * @param width 子位图每一行的像素个数 * @param height 子位图的行数 * @param m 对像素值进行变换的可选矩阵 * @param filter 如果为true,源图要被过滤。该参数仅在matrix包含了超过一个翻转才有效 * @return 一个描述了源图指定子集的位图。 Bitmap */ public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter) { Bitmap bitmap; try { bitmap = Bitmap.createBitmap(source, x, y, width, height, m, filter); } catch (OutOfMemoryError localOutOfMemoryError) { gc(); bitmap = Bitmap.createBitmap(source, x, y, width, height, m, filter); } return bitmap; } public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height) { Bitmap bitmap; try { bitmap = Bitmap.createBitmap(source, x, y, width, height); } catch (OutOfMemoryError localOutOfMemoryError) { gc(); bitmap = Bitmap.createBitmap(source, x, y, width, height); } return bitmap; } /** * 回收<br> * 方 法 名:gc <br> * 创 建 人: <br> * 创建时间:2016-6-7 上午9:32:37 <br> * 修 改 人: <br> * 修改日期: <br> * void */ private static void gc() { System.gc(); // 表示java虚拟机会做一些努力运行已被丢弃对象(即没有被任何对象引用的对象)的 finalize // 方法,前提是这些被丢弃对象的finalize方法还没有被调用过 System.runFinalization(); }
