package com.test.mem;


import java.text.DecimalFormat;


import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.os.Debug;
import android.util.Log;


/**
* 内存分配与管理,如果内存不足,则不
* @author notepaper
*
*/
public class MemoryPool {
//private static long mTotalMemUsed;//内存总共使用情况
private static long mPeakHeapUsed;//栈使用的峰值,
public MemoryPool(){

}

public static int[] mallocInts(int size){
if(!isCanMallocHeap(size * 4)){
return null;
}
int val[] = new int[size];

updatePeakHeapMem();
return val;
}

public static byte[] mallocBytes(int size){
if(!isCanMallocHeap(size)){
return null;
}
byte val[] = new byte[size];

updatePeakHeapMem();
return val;
}


public static Bitmap mallocBitmap(int width,int height,Config config){
Bitmap bmp = null;
int size = width * height;
if(config == Config.ARGB_8888){
size *= 4;
}
else if(config == Config.RGB_565){
size *= 2;
}
if(!isCanMallocBmp(size)){
return null;
}
bmp = Bitmap.createBitmap(width, height, config);
return bmp;
}


private static boolean updatePeakHeapMem(){
long total = Runtime.getRuntime().totalMemory();
long freeMem = Runtime.getRuntime().freeMemory();
long used = total - freeMem;
if(used > mPeakHeapUsed){
mPeakHeapUsed = used;
}
return true;
}

/**
* 申请heap时,剩余不足2M就会挂掉
* @param size
* @return
*/
private static boolean isCanMallocHeap(long size){
return isCanMalloc((int)(size + 1024 * 1024 * 1.5));
}

private static boolean isCanMallocBmp(long size){
if(isCanMalloc(size) && isCanMallocBmpAtPeak(size)){
return true;
}
return false;
}

private static boolean isCanMallocBmpAtPeak(long size){
double total = ((double)Runtime.getRuntime().totalMemory());
double freeMem = ((double)Runtime.getRuntime().freeMemory());
double maxMem = ((double)Runtime.getRuntime().maxMemory());


double exernalMem = (double)Debug.getNativeHeapAllocatedSize();
if(mPeakHeapUsed + exernalMem + size >= maxMem){
Log.d("MEM", "isCanMallocBmpAtPeak used="+(total-freeMem)+" exernal="+exernalMem+" size="+size+" maxMem="+maxMem+" exceed="+(total-freeMem + exernalMem + size));
return false;
}
return true;
}

/**
* 是否可以申请指定的内存
* @param size 字节数
* @return
*/
private static boolean isCanMalloc(long size){
double total = ((double)Runtime.getRuntime().totalMemory());
double freeMem = ((double)Runtime.getRuntime().freeMemory());
double maxMem = ((double)Runtime.getRuntime().maxMemory());


double exernalMem = (double)Debug.getNativeHeapAllocatedSize();
if(total-freeMem + exernalMem + size >= maxMem){
Log.d("MEM", "used="+(total-freeMem)+" exernal="+exernalMem+" size="+size+" maxMem="+maxMem+" exceed="+(total-freeMem + exernalMem + size));
return false;
}
return true;
}
/**
* 获取内存使用
*
*/
public static void memeryUsed(String tag,String title){
//usedMem为byte Byte等类型占用空间
//exernalMem 是Bitmap类型占用空间
double total = ((double)Runtime.getRuntime().totalMemory()/(1024*1024));
double freeMem = ((double)Runtime.getRuntime().freeMemory()/(1024*1024));
double maxMem = ((double)Runtime.getRuntime().maxMemory()/(1024*1024));


double exernalMem = (double)Debug.getNativeHeapAllocatedSize() /1024/1024;
DecimalFormat df = new DecimalFormat("0.000");//格式话浮点数

Log.d(tag,"["+title+"][Memery Test] [used]="+df.format(total-freeMem)
+"[exernalMem]="+df.format(exernalMem)+" [totalUsed]="+df.format(total-freeMem+exernalMem)+" [maxMem]="+df.format(maxMem));

}

}

更多相关文章

  1. Android(安卓)获取NavigationBar高度
  2. Android(安卓)JetPack-Navigation使用
  3. Android(安卓)获取已安装应用使用的Permission
  4. Android(安卓)Native Crash的log分析和定位
  5. android系统信息,cpu、内存、电池等
  6. android使用ksoap2-android调用webservice时报java.io.EOFExcept
  7. 箭头函数的基础使用
  8. NPM 和webpack 的基础使用
  9. Python list sort方法的具体使用

随机推荐

  1. 让图像识别准确率瞬间下降40个点,「江苏卷
  2. Docker compose 配置 Snipe IT 练习
  3. C语言数据存储
  4. js的增删查改的DOM操作
  5. 2021-04-07:给定一个非负数组arr,长度为N,那
  6. 苹果iPhone 12 Pro丢了或被偷了怎么定位
  7. 【js效果】下拉菜单
  8. 史上最全最新微信小程序自动化教程
  9. 20210221-2 软件管理与网络管理
  10. 【js效果】屏蔽鼠标右键