Android内存管理与申请

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));

}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值