魔趣Menu键,左上角显示可用内存数是错误的?

魔趣Menu键,左上角显示可用内存数是错误的?
none 5.0 0

卧梅又闻花,卧枝绘中天。鱼吻卧石水,卧石答春绿。
岸似绿,岸似透绿,岸似透黛绿,就似不岸格似发帖。

问题描述: Menu按键显示空闲内存和free -m显示空闲内存差别较大,怀疑Menu键空闲内存数显示错误,应该是bug?
当前版本: MK71.2-wt88047-181213-RELEASE.zip
复现步骤: 按手机Menu键(右侧通常是HOME和Back键),看左上角显示可用内存。
比对adb shell运行free -m显示空闲内存。
如我当前手机,Menu键界面显示可用内存为1331M,但是free -m显示的空闲内存却是712M,两者不一致,Menu显示的内存数是否是错的?

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

image

首先,你确定那两个区域的数值的含义是完全一样的吗?
如果它俩含义不一样,为什么要求显示的数值一样?

7.1 已不再维护。

9.0 上没有这个功能。

含义应该是一样的吧

9.1 Menu按键,不能显示空闲内存了?
为什么要取消这个功能?

这2个数值不一致,是什么原因造成的?

没有「取消」,因为本来就不是原生自带功能。

觉得没什么意义就不加了呗。

实时看剩余内存,对RAM小的手机,意义很大的

如果数值不一样,自然是含义不同了。最大可能就是一个是真的空闲内存,基于LINUX的,系统可分配的;另一个是安卓的,是可以空出来的内存,虽然目前还被一些东西占用着,但如果需要,这些占用的可以空出来。

不存在什么原因,本来意义就不一样。

下面是三条查看内存使用状况的命令
free -k (约81M)
mmexport1563609956189

cat /proc/meminfo (约80M)
mmexport1563609948719

dumpsys meminfo (约420M)

简单说free 命令查看的free 数据是没有被申请占用的,但这不意味着新的应用只有这些内存可以使用。
按照linux 的思想,为了提升IO的性能,系统会消耗一部分内存去缓存(cache)磁盘数据,但是有新应用要启动的时候,这部分内存也是可以拿来被使用的,这部分内存对新应用来说也是available 的。体会一下free 和available 的不同。

1 Like

预分配作为缓存,实际上并没有使用,这种内存,free -m是看不出来的,
所以用dumpsys可以得到更有意义的空闲内存大小么:)

dumpsys meminfo和Menu显示剩余内存还有100M左右差距

Menu显示剩余1385M
界面的剩余内存,应该不是调用dumpsys meminfo获取的吧:sweat_smile:

这段剩余内存代码是否开源的?

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)

我没有读过相关的源码,你的问题我无法回答。我了解到的,不同的linux 发行版,和不同的linux 内核版本对命令的实现都可能是不同的。所以真的想搞清楚menu 显示的剩余内存和命令显示的为什么会有差距,去读源码吧(开没开源去读一下才知道)。

https://mokeedev.review/c/MoKee/android_frameworks_base/+/18330

MemoryInfo memInfo = new MemoryInfo();
mAm.getMemoryInfo(memInfo);
int available = (int)(memInfo.availMem / 1048576L);

这段代码最终调用到了 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/meminfoMemFreeCached 加起来的数值。

该主题在最后一个回复创建后30天后自动关闭。不再允许新的回复。