截图比对
空闲内存差别很大啊:(
是不是bug呢?

hcz017
#3
首先,你确定那两个区域的数值的含义是完全一样的吗?
如果它俩含义不一样,为什么要求显示的数值一样?
9.1 Menu按键,不能显示空闲内存了?
为什么要取消这个功能?
elezen
#10
如果数值不一样,自然是含义不同了。最大可能就是一个是真的空闲内存,基于LINUX的,系统可分配的;另一个是安卓的,是可以空出来的内存,虽然目前还被一些东西占用着,但如果需要,这些占用的可以空出来。
hcz017
#12
下面是三条查看内存使用状况的命令
free -k (约81M)

cat /proc/meminfo (约80M)

dumpsys meminfo (约420M)
简单说free 命令查看的free 数据是没有被申请占用的,但这不意味着新的应用只有这些内存可以使用。
按照linux 的思想,为了提升IO的性能,系统会消耗一部分内存去缓存(cache)磁盘数据,但是有新应用要启动的时候,这部分内存也是可以拿来被使用的,这部分内存对新应用来说也是available 的。体会一下free 和available 的不同。
1 Like
预分配作为缓存,实际上并没有使用,这种内存,free -m是看不出来的,
所以用dumpsys可以得到更有意义的空闲内存大小么:)
dumpsys meminfo和Menu显示剩余内存还有100M左右差距
Menu显示剩余1385M
界面的剩余内存,应该不是调用dumpsys meminfo获取的吧
这段剩余内存代码是否开源的?
Total RAM: 1,952,156K (status normal)
Free RAM: 1,221,247K ( 107,939K cached pss + 491,480K cached kernel + 621,828K free)
Used RAM: 634,501K ( 552,637K used pss + 81,864K kernel)
Lost RAM: 96,404K
ZRAM: 4K physical used for 0K in swap ( 524,284K total swap)
Tuning: 192 (large 512), oom 184,320K, restore limit 61,440K (high-end-gfx)
hcz017
#15
我没有读过相关的源码,你的问题我无法回答。我了解到的,不同的linux 发行版,和不同的linux 内核版本对命令的实现都可能是不同的。所以真的想搞清楚menu 显示的剩余内存和命令显示的为什么会有差距,去读源码吧(开没开源去读一下才知道)。
XiNGRZ
#16
https://mokeedev.review/c/MoKee/android_frameworks_base/+/18330
MemoryInfo memInfo = new MemoryInfo();
mAm.getMemoryInfo(memInfo);
int available = (int)(memInfo.availMem / 1048576L);
XiNGRZ
#17
这段代码最终调用到了 frameworks/base/core/jni/android_util_Process.cpp
static jlong getFreeMemoryImpl(const char* const sums[], const size_t sumsLen[], size_t num)
{
int fd = open("/proc/meminfo", O_RDONLY | O_CLOEXEC);
if (fd < 0) {
ALOGW("Unable to open /proc/meminfo");
return -1;
}
char buffer[2048];
const int len = read(fd, buffer, sizeof(buffer)-1);
close(fd);
if (len < 0) {
ALOGW("Unable to read /proc/meminfo");
return -1;
}
buffer[len] = 0;
size_t numFound = 0;
jlong mem = 0;
char* p = buffer;
while (*p && numFound < num) {
int i = 0;
while (sums[i]) {
if (strncmp(p, sums[i], sumsLen[i]) == 0) {
p += sumsLen[i];
while (*p == ' ') p++;
char* num = p;
while (*p >= '0' && *p <= '9') p++;
if (*p != 0) {
*p = 0;
p++;
if (*p == 0) p--;
}
mem += atoll(num) * 1024;
numFound++;
break;
}
i++;
}
p++;
}
return numFound > 0 ? mem : -1;
}
static jlong android_os_Process_getFreeMemory(JNIEnv* env, jobject clazz)
{
static const char* const sums[] = { "MemFree:", "Cached:", NULL };
static const size_t sumsLen[] = { strlen("MemFree:"), strlen("Cached:"), 0 };
return getFreeMemoryImpl(sums, sumsLen, 2);
}
static jlong android_os_Process_getTotalMemory(JNIEnv* env, jobject clazz)
{
static const char* const sums[] = { "MemTotal:", NULL };
static const size_t sumsLen[] = { strlen("MemTotal:"), 0 };
return getFreeMemoryImpl(sums, sumsLen, 1);
}
所以答案很明显了,左上角这个可用内存的数字,是 /proc/meminfo
中 MemFree 和 Cached 加起来的数值。
system
closed
#18
该主题在最后一个回复创建后30天后自动关闭。不再允许新的回复。