Android手机内存监控常用命令及参数解释
/proc/meminfo 文件包含了和内存占用有关的原始信息。
由于篇幅有限,只显示前几行信息
HNR553T:/ $ cat proc/meminfo
MemTotal: 6291456 kB
MemFree: 2293208 kB
MemAvailable: 3452580 kB
Buffers: 5896 kB
Cached: 1335984 kB
KernelStack: 26848 kB
Mapped: 629552 kB
参数解释
MemTotal表示手机总内存。
MemFree表示系统未使用的内存。(系统层面)
MemAvailable表示可分配给应用程序的内存,分析内存泄漏主要看这个值的变化
Buffers表示给文件的缓冲大小。
Cached表示被高速缓冲存储器使用的大小。
KernelStack(内核栈)是常驻内存的,既不包括在LRU lists里,也不包括在进程的RSS/PSS内存里,所以我们认为它是kernel消耗的内存。KernelStack是给kernel code使用的。
Mapped表示设备和文件等映射的大小。
实际上,free 命令中的信息都来自于 /proc/meminfo 文件
HNR553T:/ $ free -h
total used free shared buffers
Mem: 5.1G 2.9G 2.1G 4.5M 5.7M
-/+ buffers/cache: 2.9G 2.1G
Swap: 3.1G 0 3.1G
参数解释
第二行:Mem表示系统物理内存的使用情况
第三行:-/+ buffers/cache表示buffers和cache所用总量的总和(buffers为内核缓冲区所用的内存,cache为页缓存和slabs所用的内存容量)
第四行:Swap表示swap交换内存的使用情况,也就是我们通常所说的虚拟内存。可以看到,可被用作swap的硬盘总大小为3.1G
total:内存总大小
used:系统已使用的内存。这里面的内存虽然已被使用但是可以回收的,比如cache/buffer、slab都有一部分可以回收。
free:系统未使用的内存。(系统层面)
shared:多个进程共享的内存大小,大部分是tmpfs占用(tmpfs 就是内存实现的文件系统比如 /dev/shm)
buffers:待写入磁盘的缓冲
cache:从文件读来的数据的缓存
1、从系统层面的角度来说,free表示真正尚未被使用的物理内存数量。
2、从应用程序的角度来说,可使用的内存available = free + buffer + cache,used包含cache。简单的说,系统当前可使用的内存不只是free里的内存,还需要加上used里可回收的内存。
这里特别讲一下buffers和catche
buffer:磁盘等块设备的缓冲,内存的这一部分是要写入到磁盘里的。在buffer中的数据不是即时写入磁盘,而是系统空闲或者buffer达到一定大小时再统一写到磁盘中。这些数据断电易失,为了防止数据丢失,我们最好正常关机或者多执行几次sync命令,让位于buffer上的数据理科写到磁盘里。
cache:文件系统层级的缓存,从磁盘里读取的内容是存储到这里。这样程序读取磁盘内容就会非常快,比如使用grep和find命令查找内容和文件时,第一次会比较慢,再次执行就快好几倍甚至几十倍。
Linux为了提升读写性能,会消耗一部分内存资源缓存磁盘数据。对于内核来说,buffers和cache其实都属于已经被使用的内存。当应用程序申请内存时,如果free内存不够,内核就会回收buffers和cache的内存来满足应用程序的请求。
与proc/meminfo的对应关系:
total = MemTotal
used = MemTotal - MemFree
free = MemFree
shared =
buffers = Buffers
Swap 对应SwapTotal、SwapFree
HNR553T:/ # dumpsys meminfo
Applications Memory Usage (in Kilobytes):
Uptime: 4539677 Realtime: 4539677
Total RAM: 6,291,456K (status normal)
Free RAM: 3,253,583K ( 164,903K cached pss + 779,452K cached kernel + 2,309,228K free)
ION: 236,520K ( 233,248K mapped + 0K unmapped + 3,272K pools)
Used RAM: 1,613,199K (1,380,735K used pss + 232,464K kernel)
Lost RAM: 1,424,670K
ZRAM: 4K physical used for 0K in swap (3,335,432K total swap)
Tuning: 256 (large 512), oom 322,560K, restore limit 107,520K (high-end-gfx)
参数解释
由此可知, Free RAM = cached pss + cached kernel + free
cached pss = Total PSS by OOM adjustment:里Cached那一栏的PSS总和
与proc/meminfo的对应关系:
cached kernel = Cached+Buffers-Mapped
Free RAM = MemAvailable

127|HNR553T:/ $ free -h
total used free shared buffers
Mem: 5.1G 5.0G 64M 5.5M 5.2M
-/+ buffers/cache: 5.0G 69M
Swap: 3.1G 166M 3.0G
在使用free -h看到used占满了,但手机是还有内存可以给应用程序使用的。
因为在linux中有这么一种思想,内存不用白不用,因此它尽可能的cache和buffer一些数据,以方便下次使用。但实际上这些内存也是可以立刻拿来使用的,当free内存不够时,内核就会回收buffers和cache的内存来给应用程序使用。
所以,可使用的内存available = free+buffers+cached,通过dumpsys meminfo命令的Free RAM参数可以直接得到能给应用程序使用的空闲内存大小。
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
两者都可以defsetup(options={})options.reverse_merge:size=>25,:velocity=>10end和defsetup(options={}){:size=>25,:velocity=>10}.merge(options)end在方法的参数中分配默认值。问题是:哪个更好?您更愿意使用哪一个?在性能、代码可读性或其他方面有什么不同吗?编辑:我无意中添加了bang(!)...并不是要询问nobang方法与bang方法之间的区别 最佳答案 我倾向于使用reverse_merge方法:option
我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano
我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法
ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序
我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use