我使用以下代码在我的应用程序中转储内存使用情况:
public static void dumpMemoryUsage(Context ctx) {
try {
MemoryInfo mi = new MemoryInfo();
double allocated = new Double(Debug.getNativeHeapAllocatedSize());
double available = new Double(Debug.getNativeHeapSize());
double free = new Double(Debug.getNativeHeapFreeSize());
ActivityManager activityManager = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
activityManager.getMemoryInfo(mi);
long availableMegs = mi.availMem / 1048576L; //1MB
long threshold = mi.threshold / 1048576L; //1MB
String descr = String
.format(Locale.US,
"+++System available MB:%d\nIs low:%b\nThreshold:%d\nMem class:%d\nallocated:%f\nfree:%f\navailable:%f\n",
availableMegs, mi.lowMemory, threshold,
activityManager.getMemoryClass(), allocated, free, available);
L.l(descr);
} catch (Exception e) {
L.l(e);
}
}
我在两个不同的设备 Nexus(2011 型号)和 Galaxy Note 1 上运行它。Galaxy Note 存在内存问题,并且在我添加 1-2 个位图后经常因内存问题而失败。
这是转储:
Nexus:
+++System available MB:154
Is low:false
Threshold:94
Mem class:96
allocated:5663544.000000
free:1377480.000000
available:7081984.000000
Galaxy Note:
+++System available MB:316
Is low:false
Threshold:64
Mem class:64
allocated:5361664.000000
free:155648.000000
available:5832704.000000
请注意,Debug.getNativeHeapFreeSize() 调用在 nexus 上返回 1377480.000000,在 Galaxy 上仅返回 155648.000000。这怎么可能。这个电话的真正含义是什么?我在全新的应用程序安装上进行了两项测试,应用程序没有完成任何工作 - 只是呈现第一个屏幕,几乎没有几个 TextViews 和按钮。Galaxy Note 1 的内存等级为 64MB,所以我认为我没有达到这个限制。即使我在屏幕上添加了许多位图,Nexus 上也没有内存问题,所以我认为我没有使用太多内存。