android内存检测实现
16lz
2021-01-25
实现android内存检测的作用在哪里?
当你处理一个非常大的图片缩放的时候,由于使用了ARGB8888的色彩,导致一个像素是4Byte。一个2000×3000分辨率的图片消耗的内存是:23437.5KB。这时候消耗的内存是23.4M的内存。android2.2官方ROM最大内存是24M,那么打开美图秀秀,处理一张2000像素的图的时候就会发生问题, 4.0官方ROM的话,你的app最大内存限制是64M,4.4的时候,内存限制是96M。都不是很大,所以内存还是很紧张的。
这时候在一些手机上就会出现OOM的情况。
所以,在遇到这种情况的时候需要先检测下还能不能再申请内存了!
PS:现在很多ROM厂商都修改了最大内存限制,我做过测试我的L36H,内存限制是256MB。这样的话可以使用更多的内存。但是还有很多品牌没有做修改,三星是没有修改4.0 4.2都是64M,moto也没有,Nexus 系列更是 没有修改。
这里我写了个工具类,供使用的时候操作,获取手机剩余内存和app的剩余可消耗的内存。
废话不说直接上代码!
<span style="font-size:14px;">package com.commons.utils.memory;import android.annotation.TargetApi;import android.app.ActivityManager;import android.content.Context;import android.os.Build;import android.util.Log;/** *内存的工具类 */public class MemoryUtils { private static final String TAG="MemoryUtils"; /** * 打印当前手机内存信息应用的内存信息 */ @TargetApi(Build.VERSION_CODES.JELLY_BEAN) public static void printMemoryInfo() { final String TAG="MemoryUtils.printMemoryInfo()"; //打印当前APP内存信息 //开启了 android:largeHeap="true" 后,就是启用了流氓应用的内存限制 //打印当前应用内存信息 Runtime rt = Runtime.getRuntime(); Log.d(TAG, "APP当前内存状态: 最大可申请内存:" + rt.maxMemory() / 1024/1024 +"MB 已申请内存:" + rt.totalMemory() / 1024/1024 + "MB 空闲内存:"+rt.freeMemory()/1024/1024+"MB"); } /** * 获得app可用内存的字节数 这个类不需要try,catch理论上不会报错 */ @TargetApi(Build.VERSION_CODES.HONEYCOMB) public static long getAppSurplusMe() { final String TAG="MemoryUtils.getAppSurplusMe()"; Runtime rt = Runtime.getRuntime(); //一下参数单位为字节数 long totalMemory=rt.totalMemory();//这个是已经申请的内存,等于已经使用的内存加上空闲内存 long maxMemory=rt.maxMemory();//最大内存限制 long freeMemory=rt.freeMemory(); //假如最大内存限制是64M,已经申请了34M,空闲4M,那么其实当前使用的是:(34-4)M,而实际当前有效可使用的内存是:64-(34-4)=34; //64-(34-4)=34 请允许我引用高数老师的那句话:"同理可得" 64-34+4 //so long surplusMemory=maxMemory-totalMemory+freeMemory; Log.d(TAG, "系统当前内存状态: 最大可申请内存:" + rt.maxMemory() / 1024/1024 +"MB 已申请内存:" + rt.totalMemory() / 1024/1024 + "MB 空闲内存:"+rt.freeMemory()/1024/1024+"MB"); return surplusMemory; } /** * 获得手机可用内存的字节数 这个类不需要try,catch,理论上不会报错 * * 这个方法要慎用 容易导致崩溃 特别在引导页的时候 低内存手机容易发生崩溃 * * @param context * @return */ public static long getPhoneSurplusMe(Context context) { ActivityManager am = (ActivityManager)context.getSystemService(context.ACTIVITY_SERVICE); ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo(); am.getMemoryInfo(mi); return mi.availMem; }}</span>
更多相关文章
- Android中的内存管理机制
- Android(安卓)解析包出错问题
- Android的致命问题——性能优化
- Android(安卓)之旅:Google 发布 Android(安卓)性能优化典范
- Android获取ROOT权限的通用方法
- android手机安全问题汇总(非技术)
- Google送Nexus One手机啦,大家快去收邮件
- Android车载方案公司,你该何去何从?
- 谷歌无限期推迟Android(安卓)2.1操作平台源代码开放