大家好,又见面了,我是全栈君。
以前我对这块认识很模糊,而且还有错误的认识;今天由我同事提醒,所以我决定来好好的缕缕这块的关系。
——————————————-1.参数含义———————————————————————– Mem:表示物理内存统计 total: 表示系统总物理内存5993156kb(约5852M) used: 表示总计分配给缓存(包含buffers 与cached),但其中可能部分缓存未实际使用 free:表示未分配的内存 shared: 表示共享内存 buffers:表示系统分配但未被使用的buffers数量 cached:表示系统分配但未被使用的cache的数量
在Free命令中显示的buffer和cache,它们都是占用内存: buffer : 作为buffer cache的内存,是块设备的读写缓冲区,更靠近存储设备,或者直接就是disk的缓冲区。 cached: 作为page cache的内存, 文件系统的cache,是memory的缓冲区 。 如果cached 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的读IO 必会非常小 。
-/+ buffers/cached: 表示物理内存的缓存统计 used: 表示实际使用的buffers与cache的总量,这就是实际使用的内存总量 free: 表示未被使用的buffers与cache和未被分配的内存之和,这就是系统当前实际可能内存(所以一般linux机器看可用内存就看此值)
Swap: 表示硬盘上交换分区的使用情况。只有mem被当前进程实际占用完,即没有了buffers和cache时,才会使用到swap。
——————————————-2.常用概念———————————————————————– 物理内存总大小 : mem.total=mem.used+mem.free mem.total=(-/+ buffers/cached).used+(-/+ buffers/cached).free
已经分配的内存大小: mem.used=mem.buffers+mem.cached+(-/+ buffers/cached).used
实际可用内存大小: (-/+ buffers/cached).free=mem.free+mem.buffers+mem.cached
——————————————-3.手工清除缓存—————————————————————— # sync # echo 1 > /proc/sys/vm/drop_caches echo 2 > /proc/sys/vm/drop_caches echo 3 > /proc/sys/vm/drop_caches
cache释放: a.To free pagecache: echo 1 > /proc/sys/vm/drop_caches
b.To free dentries and inodes: echo 2 > /proc/sys/vm/drop_caches
c.To free pagecache, dentries and inodes: echo 3 > /proc/sys/vm/drop_caches
说明,释放前最好sync一下,防止丢数据。
——————————————-4.常见疑惑———————————————————————– 1.用户常见的疑问是,为什么free这么小,是否关闭应用后内存没有释放? 但实际上,我们都知道这是因为Linux对内存的管理与Windows不同,free小并不是说内存不够用了,应该看的是free的第二行最后一个值:-/+ buffers/cache: 2592892Kb,这才是系统可用的内存大小。
2.free内存还有200M,cache里有58G,然后程序就跪了,抛了个tcmalloc allocation failed 65536, out of memory(needed 65312 bytes). 需要内存时为什么cache里面的没能释放? cache 中有程序在占用就无法释放了。
3.有时候free太小,cached特别大时启动mysql会报错,这个是什么原因? 这说明内存确实不够,cached并不是全部可以释放的,有程序占用就不能释放了
4.我的Linux上cache占满RAM时系统非常慢,系统也不自动释放cache。所以号称“cache对性能只有好处而没坏处”是假的! 这个要看你实际是使用的应用是什么。cache能带来的好处是,减轻频繁读写硬盘的需要,也就是降低IO,这特别是对于服务器上的应用来说是很常见的。相反,如果cache需要频繁更新,那会出现您提到的问题了
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/108707.html原文链接:https://javaforall.cn