潍坊市建设工程管理处网站wordpress app端
- 作者: 五速梦信息网
- 时间: 2026年04月20日 07:17
当前位置: 首页 > news >正文
潍坊市建设工程管理处网站,wordpress app端,建设摩托车是杂牌吗,抢注qq空间专属域名网站作者#xff1a;向阳逐梦 1.什么是OOM#xff1f;为什么会引起OOM#xff1f;
答#xff1a;Out Of Memory(内存溢出)#xff0c;我们都知道Android系统会为每个APP分配一个独立的工作空间#xff0c;或者说分配一个单独的Dalvik虚拟机#xff0c;这样每个APP都可以独立… 作者向阳逐梦 1.什么是OOM为什么会引起OOM
答Out Of Memory(内存溢出)我们都知道Android系统会为每个APP分配一个独立的工作空间或者说分配一个单独的Dalvik虚拟机这样每个APP都可以独立运行而不相互影响而Android对于每个Dalvik虚拟机都会有一个最大内存限制如果当前占用的内存加上我们申请的内存资源超过了这个限制系统就会抛出OOM错误另外这里别和RAM混淆了即时当前RAM中剩余的内存有1G多但是OOM还是会发生别把RAM(物理内存)和OOM扯到一起另外RAM不足的话就是杀应用了而不是仅仅是OOM了而这个Dalvik中的最大内存标准不同的机型是不一样的可以调用
ActivityManager activityManager (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
Log.e(HEHE,最大内存 activityManager.getMemoryClass());获得正常的最大内存标准又或者直接在命令行键入
adb shell getprop | grep dalvik.vm.heapgrowthlimit你也可以打开系统源码/system/build.prop文件看下文件中这一部分的信息得出
dalvik.vm.heapstartsize8m
dalvik.vm.heapgrowthlimit192m
dalvik.vm.heapsize512m
dalvik.vm.heaptargetutilization0.75
dalvik.vm.heapminfree2m
dalvik.vm.heapmaxfree8m我们关注的地方有三个heapstartsize堆内存的初始大小heapgrowthlimit标准的应用的最大堆内存大小heapsize则是设置了使用android:largeHeap的应用的最大堆内存大小
我这里试了下手头几个机型的正常最大内存分配标准 你也可以试试自己手头的机子~
好啦不扯了关于OOM问题的产生就扯到这里再扯就到内存管理那一块了可是个大块头现在还啃不动…下面我们来看下避免Bitmap OOM的一些技巧吧
2.避免Bitmap引起的OOM技巧小结
1采用低内存占用量的编码方式
上一节说了BitmapFactory.Options这个类我们可以设置下其中的inPreferredConfig属性默认是Bitmap.Config.ARGB_8888我们可以修改成Bitmap.Config.ARGB_4444Bitmap.Config ARGB_4444每个像素占四位即A4R4G4B4那么一个像素点占444416位Bitmap.Config ARGB_8888每个像素占八位即A8R8G8B8那么一个像素点占888832位默认使用ARGB_8888即一个像素占4个字节
2图片压缩
同样是BitmapFactory.Options我们通过inSampleSize设置缩放倍数比如写2即长宽变为原来的1/2图片就是原来的1/4如果不进行缩放的话设置为1即可但是不能一味的压缩毕竟这个值太小的话图片会很模糊而且要避免图片的拉伸变形所以需要我们在程序中动态的计算这个inSampleSize的合适值而Options中又有这样一个方法inJustDecodeBounds将该参数设置为true后decodeFiel并不会分配内存空间但是可以计算出原始图片的长宽调用options.outWidth/outHeight获取出图片的宽高然后通过一定的算法即可得到适合的inSampleSize这里感谢街神提供的代码——摘自鸿洋blog
public static int caculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {int width options.outWidth;int height options.outHeight;int inSampleSize 1;if (width reqWidth || height reqHeight) {int widthRadio Math.round(width * 1.0f / reqWidth);int heightRadio Math.round(height * 1.0f / reqHeight);inSampleSize Math.max(widthRadio, heightRadio);}return inSampleSize;
}然后使用下上述的方法即可
BitmapFactory.Options options new BitmapFactory.Options();
options.inJustDecodeBounds true; // 设置了此属性一定要记得将值设置为false
Bitmap bitmap null;
bitmap BitmapFactory.decodeFile(url, options);
options.inSampleSize computeSampleSize(options,128,128);
options.inPreferredConfig Bitmap.Config.ARGB_4444;
/* 下面两个字段需要组合使用 */
options.inPurgeable true;
options.inInputShareable true;
options.inJustDecodeBounds false;
try {bitmap BitmapFactory.decodeFile(url, options);
} catch (OutOfMemoryError e) {Log.e(TAG, OutOfMemoryError);
}3.及时回收图像
如果引用了大量的Bitmap对象而应用又不需要同时显示所有图片。可以将暂时不用到的Bitmap对象及时回收掉。对于一些明确知道图片使用情况的场景可以主动recycle回收比如引导页的图片使用完就recycle帧动画加载一张画一张释放一张使用时加载不显示时直接置null或recycle比如imageView.setImageResource(0); 不过某些情况下会出现特定图片反复加载释放再加载等低效率的事情…
4.其他方法
下面这些方法我并没有用过大家可以自行查阅相关资料
1.简单通过SoftReference引用方式管理图片资源
建个SoftReference的hashmap使用图片时先查询这个hashmap是否有softreference softreference里的图片是否为空如果为空就加载图片到softreference并加入hashmap。无需再代码里显式的处理图片的回收与释放gc会自动处理资源的释放。这种方式处理起来简单实用能一定程度上避免前一种方法反复加载释放的低效率。但还不够优化。
示例代码
private MapString, SoftReferenceBitmap imageMap new HashMapString, SoftReferenceBitmap();public Bitmap loadBitmap(final String imageUrl,final ImageCallBack imageCallBack) {SoftReferenceBitmap reference imageMap.get(imageUrl);if(reference ! null) {if(reference.get() ! null) {return reference.get();}}final Handler handler new Handler() {public void handleMessage(final android.os.Message msg) {//加入到缓存中Bitmap bitmap (Bitmap)msg.obj;imageMap.put(imageUrl, new SoftReferenceBitmap(bitmap));if(imageCallBack ! null) {imageCallBack.getBitmap(bitmap);}}};new Thread(){public void run() {Message message handler.obtainMessage();message.obj downloadBitmap(imageUrl);handler.sendMessage(message);}}.start();return null ;
}// 从网上下载图片
private Bitmap downloadBitmap (String imageUrl) {Bitmap bitmap null;try {bitmap BitmapFactory.decodeStream(new URL(imageUrl).openStream());return bitmap ;} catch (Exception e) {e.printStackTrace();return null;}
}
public interface ImageCallBack{void getBitmap(Bitmap bitmap);
}2.LruCache sd的缓存方式
Android 3.1版本起官方还提供了LruCache来进行cache处理当存储Image的大小大于LruCache 设定的值那么近期使用次数最少的图片就会被回收掉系统会自动释放内存使用示例
步骤
1要先设置缓存图片的内存大小我这里设置为手机内存的1/8,手机内存的获取方式int MAXMEMONRY (int) (Runtime.getRuntime() .maxMemory() / 1024);
2LruCache里面的键值对分别是URL和对应的图片
3重写了一个叫做sizeOf的方法返回的是图片数量。
private LruCacheString, Bitmap mMemoryCache;
private LruCacheUtils() {if (mMemoryCache null)mMemoryCache new LruCacheString, Bitmap(MAXMEMONRY / 8) {Overrideprotected int sizeOf(String key, Bitmap bitmap) {// 重写此方法来衡量每张图片的大小默认返回图片数量。return bitmap.getRowBytes() * bitmap.getHeight() / 1024;}Overrideprotected void entryRemoved(boolean evicted, String key,Bitmap oldValue, Bitmap newValue) {Log.v(tag, hard cache is full , push to soft cache);}};
}4下面的方法分别是清空缓存、添加图片到缓存、从缓存中取得图片、从缓存中移除。
移除和清除缓存是必须要做的事因为图片缓存处理不当就会报内存溢出所以一定要引起注意。
public void clearCache() {if (mMemoryCache ! null) {if (mMemoryCache.size() 0) {Log.d(CacheUtils,mMemoryCache.size() mMemoryCache.size());mMemoryCache.evictAll();Log.d(CacheUtils, mMemoryCache.size() mMemoryCache.size());}mMemoryCache null;}
}public synchronized void addBitmapToMemoryCache(String key, Bitmap bitmap) {if (mMemoryCache.get(key) null) {if (key ! null bitmap ! null)mMemoryCache.put(key, bitmap);} elseLog.w(TAG, the res is aready exits);
}public synchronized Bitmap getBitmapFromMemCache(String key) {Bitmap bm mMemoryCache.get(key);if (key ! null) {return bm;}return null;
}/*** 移除缓存* * param key*/
public synchronized void removeImageCache(String key) {if (key ! null) {if (mMemoryCache ! null) {Bitmap bm mMemoryCache.remove(key);if (bm ! null)bm.recycle();}}
}其实想要全面掌握好 Android 性能优化的话这些知识点你必须要有所了解如 内存优化、网络优化、卡顿优化、存储优化……等其实除了这些像Framework 底层原理逻辑话也需要有一定的了解为了让大家一次都可以了解全所以将其整合成名为《Android 性能优化核心知识点手册》和《Android Framework核心知识点手册》大家可以参考下
《Android 性能调优核心笔记汇总》https://qr18.cn/FVlo89 《Android 性能监控框架》https://qr18.cn/FVlo89 《Android Framework核心知识点手册》https://qr18.cn/AQpN4J
开机Init 进程开机启动 Zygote 进程开机启动 SystemServer 进程Binder 驱动AMS 的启动过程PMS 的启动过程Launcher 的启动过程Android 四大组件Android 系统服务 - Input 事件的分发过程Android 底层渲染 - 屏幕刷新机制源码分析Android 源码分析实战
相关文章
-
潍坊市坊子区建设局网站中国建设银行个人网上银行登录
潍坊市坊子区建设局网站中国建设银行个人网上银行登录
- 技术栈
- 2026年04月20日
-
潍坊企业做网站高权重网站收录问题
潍坊企业做网站高权重网站收录问题
- 技术栈
- 2026年04月20日
-
潍坊建设网站的公司重庆制作网站培训
潍坊建设网站的公司重庆制作网站培训
- 技术栈
- 2026年04月20日
-
潍坊市作风建设年活动网站唐山网站开发培训
潍坊市作风建设年活动网站唐山网站开发培训
- 技术栈
- 2026年04月20日
-
潍坊网络建站模板广告设计公司vi
潍坊网络建站模板广告设计公司vi
- 技术栈
- 2026年04月20日
-
潍坊网站建设 APP开发小程序下列哪个不是网络营销成熟阶段出现的网络营销方式
潍坊网站建设 APP开发小程序下列哪个不是网络营销成熟阶段出现的网络营销方式
- 技术栈
- 2026年04月20日






