On my system, they are caused mostly by ION (which replaces pmem). If ion debug is enabled with your kernel, you can calculate your ION usage with this script:
adb shell cat /d/ion/heaps/system|perl -ne 'chomp; if (m/pages in.*pool = (\d+) total/) {$x += $1;} if (m/^\s+total\s+(\d+)$/) {$y += $1} END {printf "use: %d kb, cache: %d kb; total: %d kb", $y/1024, $x/1024, ($x + $y)/1024}'
In fact, any kernel page allocation done and tracked by drivers will not be tracked by the kernel, thus counting for the lost ram.
After I stop the system server, I used another .awk script to calculate lost ram (dumpsys meminfo will require the meminfo service and thus won't work anymore), and the lost ram is very closely following ION debug output:
#!/usr/bin/awk
BEGIN {
types["MemTotal"] = 1;
types["Pss"] = 1;
types["MemFree"] = 1;
types["Cached"] = 1;
types["Buffers"] = 1;
types["Shmem"] = 1;
types["Slab"] = 1;
}
## start code-generator "^\\s *#"
#echo
# for x in Pss MemTotal MemFree Cached Buffers Shmem Slab; do
# cat << EOF
#/$x: / {
# hash["$x"] += \$2;
# next
#}
#
#EOF
# done
## end code-generator
## start generated code
/Pss: / {
hash["Pss"] += $2;
next
}
/MemTotal: / {
hash["MemTotal"] += $2;
next
}
/MemFree: / {
hash["MemFree"] += $2;
next
}
/Cached: / {
hash["Cached"] += $2;
next
}
/Buffers: / {
hash["Buffers"] += $2;
next
}
/Shmem: / {
hash["Shmem"] += $2;
next
}
/Slab: / {
hash["Slab"] += $2;
next
}
## end generated code
END {
lost = 0;
for (type in types) {
if (type == "MemTotal") {
lost += hash[type];
} else {
lost -= hash[type];
}
}
print "lost: " lost " kB\n";
}
I also checked again after I force a kernel memory shrink with adb shell sh -c 'echo 3 > /proc/sys/vm/drop_caches'
, the results are still very close.