@[TOC]
一、内存简介
1、为什么要做内存管理
在日常开发中,JVM内存分配、OOM问题、垃圾回收等都和内存有关。
计算机不可能将所有用户进程和系统所需要的全部程序和数据放入主存,所以操作系统必须对内存空间进行合理有效的分配。
内存管理功能: 内存分配回收 - 主存储器(物理内存)的分配和管理。 地址转换 - 将逻辑地址转换成相应的物理地址(虚拟内存相关)。 内存扩充 - 利用虚拟存储技术,从逻辑上扩充主存(硬盘开辟一块空间当内存使用)。 存储保护 - 保证各进程在各自的存储空间内运行,互不干扰。
2、内存和外存(硬盘)概念
我们常说的存储有两大类,内存(内存条)和外存(硬盘、U盘),其中ROM和RAM都是属于内存。
ROM: 全程Read Only Memory,只读存储器或者固化存储器; 在系统停止供电的时候仍然可以保持数据,但是电脑硬盘部署ROM内存,硬盘是外存; 只能读取,用来存储和保存永久数据,不能随意更新,在任何时候都可以读取,即使是断电,ROM也能够保留数据; 常见的计算机的ROM内存,存储的事BIOS程序、机器码和出厂信息等,BIOS(Basic Input Output System)是在通电引导阶段运行硬件初始化,为操作系统提供运行时服务的固件,是开机时运行的第一个程序。
RAM: 全程Random Access Memory随机存取存储器; 掉电之后就丢失数据,常见的RAM就是计算机的内存,RAM有两大类,静态RAM、动态RAM。
静态RAM(Static RAM/SRAM):速度非常快,是目前读写最快的存储设备,但是非常昂贵;只在要求很苛刻的地方使用,比如CPU的一级缓存、二级缓存、三级缓存。
动态RAM(Dynamic RAM/DRAM):保留数据的时间很短,速度也比SRAM慢,不过比任何的ROM都要快,价格上来说DRAM相比SRAM要便宜很多,比如常见的计算机内存。
3、内存的分配
(1)前言
计算机的物理内存上每字节都有一个唯一的物理地址,但是进程直接使用物理内存空间会有很多问题:
进程malloc分配一块很大的连续的内存空间,可能会出现有足够多的空闲物理内存,却没有足够大的连续空闲内存;
四处分散的内存块就是内存碎片,这样会浪费内存空间;
进程读写内存的安全性问题,物理内存本身是不限制访问的,任何地址都可以读写,进程执行错误的指令可以修改其他进程的数据,包括只读数据,这样有严重的安全问题。
所以,需要一个内存分配的机制,来确保不会出问题。
(2)什么是虚拟内存
Linux给每个创建的进程分配一个独立且连续的虚拟地址空间就是虚拟内存,超级大的字节数组(32位和64位系统不一样);
计算机处理器的地址有32位和64位两种,对应的虚拟地址空间大小分别为2^32^字节和2^64^字节;
它使得应用程序认为拥有一个连续完整的地址空间的可用内存,但是只是虚拟的;
实际上进程用了多少空间,操作系统就会给他划出多少空间;
所有的进程共享一块物理内存,每个进程只需要把目前需要的虚拟内存映射到物理内存上;
增加了虚拟内存后,进程如果要访问内存时,就需要通过虚拟内存映射来实现。
(3)什么是虚拟内存映射
不是所有的虚拟内存都会分配物理内存,只有那些实际使用的虚拟内存才分配物理内存; 分配后的物理内存,是通过内存映射来管理的,即将不同进程的虚拟地址和不同内存的物理地址映射起来; 内存映射,其实就是将虚拟内存地址映射到物理内存地址。
CPU要访问虚拟内存地址,要经过地址翻译成物理地址才能访问,通过内存管理单元(memory management unit)MMU; MMU是一种硬件电路,速度很快,主要工作是进行内存管理(CPU并不直接和物理内存打交道); MMU来翻译成对应的内存物理地址,利用存放在主存中的页表来动态翻译虚拟地址,该表的内容由操作系统管理。
(4)什么是页表
页表是一种特殊的数据结构,进程要知道哪些内存地址上的数据在物理内存上,哪些不在,还有在物理内存上的哪里,这些信息用页表来记录。 页表每个表项就是一个记录,类似数据库的一个表,有多个字段存储不同的信息。
当进程访问某个虚拟地址,就会先去查页表,如果发现对应的数据不在物理内存中,则发生缺页异常。
注意 使用malloc申请内存时是延时分配,并未真实分配物理内存,到真正开始使用malloc申请的物理内存时,出现Page Fault缺页异常(进程从用户态切换到内核态),发现没有记录才会触发申请,这就是内存的惰性分配机制。
触发Page Fault的原因有多种(对应的缺页异常的处理也不一样): 没有建立Virtual Address虚拟地址 ->Physical Address物理地址的映射; 访问的地址在物理内存中不存在,要从磁盘/swap分区读入才能使用,因为磁盘太慢,所以性能影响比较大; 访问的地址内存非法,可能会导致进程宕掉。
总结: 一个运行中的进程,不是所有的虚拟地址在物理内存中都有对应的页; 当进程还没有开始运行的时候,程序的代码段和数据段实际上都放在磁盘中; 当进程开始运行的时候,进程需要从内存中读出这段程序的代码; 进程去寻找页表,页表中的地址不在物理内存上,因此就会发生缺页异常。
(5)页表和页表项
在x86架构系统中,物理地址中每4KB作为一页,以页为单位映射。
应用程序使用虚拟内存,通过MMU找映射表(页表),把连续的虚拟内存空间,映射到分散的物理内存空间。
映射表中的每一个页表项,指向4KB物理地址,4GB空间可以分割为1024 * 1024个页表项。
32位处理器的操作系统创建的进程分配4GB虚拟内存,每页指向4KB物理地址,共有4GB/4KB个页表项 = 1024 * 1024个页表项。
映射表自身是需要保存在物理内存中的。(页表中每一个表项大小是32bit,占据4Bite,那就需要102410244Bite = 4MB来存储映射表)
但是有些程序用不了那么多,但系统也分配了4MB来存储这个映射表(页表),造成浪费。
(6)多级页表
如果一个进程只用一个页表,那么每个进程都必须要分配4MB来存储这个页表,会造成浪费,于是一个大的页表可以拆分成1024个体积更小的页表(类似mysql分表)。 这样,只需要使用1024个页表,每一个页表中只有1024个页表项。 这样,一个页表中有1024个页表项,每一个页表项占4个字节,一个页表占4KB的物理存储内存空间。
将一个大的页表分成1024个页表,这就需要一个额外的页表来管理这些小的页表,这个页表就叫做页目录表。
这样,一个页表项占4Byte的物理存储内存空间;
一个页表项指向存储4KB的物理内存空间;
一个页表占4KB的物理存储内存空间;
一个页表指向存储4MB的物理内存空间。
每个进程可以根据需要分配的内存空间来决定需要多少个页表。
(7)页目录表
一个页表中的一个表项来指向了每一个物理页;
4Gb内存总共会有1024个页表,而页目录表就是管理指向这1024个页表。
页目录的字段属性和页表是一样的,所以页目录中共有1024个页表项,指向1024个页表的物理地址。
在页目录表中,每一个表项指向一个页表的开始的物理地址;
常规每个应用程序都有自己的页目录和页表;
从页目录表到页表,这样多级控制的方式,称为多级页表。
3、内存的磁盘存储:swap
(1)操作系统内存不够会怎么办
回收内存:把不常用的内存,通过算法来进行淘汰,比如LRU算法回收内存。 内存置换:把不常用的内存通过交换分区直接写到磁盘中,置换一部分空间使用。 杀死进程:内存紧张时系统还会通过OOM(Out of Memory),会选择杀掉一些进程释放掉一些内存(给进程打分,oom_score)。
(2)什么是交换分区swap
进程占用内存很大,会导致内存消耗完,为解决该问题,操作系统运用Swap技术,拿部分硬盘空间来充当内存使用。
操作系统欺骗进程,内存还有很多,就像CPU超线程一样,1核当2个核来用。
Swap就是Linux下的虚拟内存分区,作用是在物理内存使用完之后,将磁盘空间(也就是Swap分区)虚拟成内存来使用。
换页机制:
操作系统把物理内存中放不下的数据临时放到磁盘上,等到需要的时候再放回到物理内存中,提供超过物理内存容量的空间。
访问数据被Swap换出,物理内存是有限资源,运行多进程时并不是每个进程都活跃,系统会启动内存页面置换(操作系统的页面置换算法),将长时间未使用的物理内存页帧放到Swap分区,让出资源给其他进程。这样当存在于Swap分区的页面被访问时,就会触发Page Fault缺页异常,从而再置换回物理内存。
预取机制: 换页过程涉及的磁盘IO操作,读取耗时比较多,因此操作系统会引入预取机制进行优化。 当发生换入操作时,预测还有哪些页会被访问,提前将它们一并换入物理页内存,减少发生缺页异常的次数。
(3)内存页面置换算法
进程访问的页面不在内存中,需要将其调入,但内存已无空闲空间时,就需要从内存中调出一页程序或数据,送入磁盘的对换区;
选择调出页面的算法就称为页面置换算法,决定应该换出哪个页面;
页面的换入换出需要有磁盘的IO,会有较大的开销,好的页面置换算法追求更少的缺页率。
最佳置换算法(OPT): 选择的被淘汰页面是以后永不使用的页面,或是在最长时间内不再被访问的页面,以便保证获得最低的缺页率。 性能最好,但是没法预知哪个页面未来不被访问,无法实现。
先进先出页面置换算法(FIFO): 优先淘汰最早进入内存的页面,即在内存中驻留时间最久的页面。 实现简单,但算法性能差。
最近最久未使用置换算法(LRU): 选择最近最长时间未访问过的页面进行淘汰,它认为过去一段时间内未访问过的页面,在最近的将来可能也不会被访问。 算法性能好,但是开销大,需要硬件支持。
时钟置换算法(CLOCK): 性能和开销较均衡的算法,比LRU差一些,与FIFO差不多。
4、swap配置实战
(1)Swap配置参数:swappiness
参数可以从 0 - 100进行设置,默认值swappiness=60,即内存使用率超过100 -60 = 40%时开始使用交换分区。
swappiness=0的时候表示最大限度使用物理内存,尽量不用swap空间,有些云服务器厂商直接设置为0。注意,swappiness设置为0并不会禁止swap,是最大限度不用,而不是一定不用,想要禁用swap,就不要开启swap。
swappiness=100的时候表示积极使用swap分区,把内存上的数据及时搬运到swap空间。
# 查看是否开启swap,total是0的话说明没开启
[root@localhost ~]# free -h
total used free shared buff/cache available
Mem: 3.7G 619M 2.7G 8.6M 425M 2.9G
Swap: 2.0G 0B 2.0G
# 查看
[root@localhost ~]# cat /proc/sys/vm/swappiness
30
# 临时修改
[root@localhost ~]# echo 10 > /proc/sys/vm/swappiness
[root@localhost ~]# cat /proc/sys/vm/swappiness
10
# 永久调整
vi /etc/sysctl.conf # 加上vm.swappiness=10
(2)swap分区和创建swap文件
Linux支持两种类型的swap:Swap分区和Swap文件(我们这里用文件的方式)
# 创建swap分区文件有多种方式,此处用dd命令创建
# dd用于指定大小的块,拷贝一个文件,并在拷贝的同时进行转换。
# if=文件名:输入文件名,缺省为标准输入,即指定源文件
# of=文件名:输出文件名,缺省为标准输出,即指定目的文件
# bs=bytes:同时设置读入/输出的块大小为bytes个字节
# count=blocks:仅拷贝blocks个块,块大小等于指定的字节数
# 增加swap分区文件大小,创建一个大小为256MB的文件256*1024k=262144
# /dev/zero是一个输入设备,用它来初始化文件
dd if=/dev/zero of=/swapfile bs=1024 count=262144
# 把创建的文件变成swap文件
mkswap /swapfile
# 启用这个swap文件
swapon /swapfile
# 【可选】编辑/etc/fstab文件,末行添加下面命令,每次开机时自动加载swap文件
vi /etc/fstab
/swapfile swap swap default 0 0
# 【可选】如果不需要了,也可以卸载
sudu swapoff /swapfile
#【可选】查看swap文件位置
swapon -s
[root@localhost ~]# swapon -s
Filename Type Size Used Priority
/swapfile file 2097148 0 -2
# 再次查看swap
free -h
(3)配置建议
根据不同的应用,有不同的配置,比如有些性能要求高的中间件,由于硬盘IO比较慢,会要求禁用swap。
分配太多的Swap空间会浪费磁盘空间,而Swap空间太少,则系统内存不够就会发生错误。
redhat官方建议,物理内存小于等于2GB的swap应设置为物理内存的2倍;物理内存大于2GB小于等于8GB时swap应设置为等同于物理内存大小;物理内存大于8GB时swap应设置为大于等于4GB但不超过8GB。
个人建议:生产环境,最好是设置swappiness=10,不要设置swappiness=0
(4)应用场景
kubernetes集群一般要关闭swap,k8s集群一般认为是内存足够的,开启swap会影响性能; java的应用一般也要关闭swap,像RocketMQ、ElasticSearch等。(Java应用会用到堆,开启了swap就会部分存储到磁盘上,程序在GC的时候会遍历所有堆内存,如果这部分内存是被swap到磁盘上,GC遍历的时候就会有磁盘IO影响性能)
5、free命令详解
free命令,用于显示Linux系统中空闲的、已用的物理内存、swap内存和被内核使用的buffer。
| 参数 | 说明 |
|---|---|
| -b | Byte为单位显示内存使用情况 |
| -k | KB为单位显示内存使用情况 |
| -m | MB为单位显示内存使用情况 |
| -g | GB为单位显示内存使用情况 |
| -h | 自动化以更好的可读性方式显示 |
| -w | 将buffer和cache拆分单独的两个列显示 |
| -s <间隔秒数> | 持续观察内存使用情况,比如free -s 2,每两秒刷新一次 |
| -t | 显示内存总和列 |
[root@localhost ~]# free -h -t
total used free shared buff/cache available
Mem: 3.7G 622M 2.7G 8.6M 426M 2.9G
Swap: 2.0G 0B 2.0G
Total: 5.7G 622M 4.7G
结果: total:总计物理内存+Swap的大小; used:已使用内存; free:可用的内存; shared:被共享使用的物理内存大小; buffer/cache:磁盘的缓冲和缓存大小,buffers是块设备做的缓冲大小,cached是给文件做缓存大小; avaliable:可以被程序使用的内存大小。
free和avaliable有什么区别? free是真正未被使用的物理内存数量。 avaliable是应用程序的角度看到的可用内存数量。 linux为了提升读写性能,会消耗一部分内存资源缓存磁盘数据,就是buffer和cache,没有足够的free内存可以用时,内核就会从buffer和cache中回收内存。 avaliable = free + buffer/cache total = used + free + buffer/cache
6、top命令详解
# 任务队列信息,CPU 1 5 15分钟负载
top - 14:36:37 up 5:48, 1 user, load average: 0.00, 0.01, 0.05
# 任务进程信息,total总进程数,running运行进程数,sleeping睡眠进程数,stopped停止进程数,zombie僵尸进程数
Tasks: 110 total, 2 running, 108 sleeping, 0 stopped, 0 zombie
# cpu信息,按1会展开
# us用户态占用cpu百分比,sy内核态占用cpu百分比,id空闲cpu百分比
# wa等待IO占用CPU百分比,hi硬中断(Hardware IRQ)占用CPU百分比,si软中断(Software Interrupts)占用cpu百分比
%Cpu0 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 0.0 us, 0.5 sy, 0.0 ni, 99.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
# 内存状态,total物理内存,free空闲内存,used使用中的内存,buffer/cache缓存的内存
KiB Mem : 3879952 total, 2782516 free, 658460 used, 438976 buff/cache
# swap交换分区信息,total交换区总量,free空间交换区量,used使用中的交换区量,avail进程可用内存空间
KiB Swap: 2097148 total, 2097148 free, 0 used. 2992316 avail Mem
# 进程的状态信息:PID进程id,USER进程所有者,PR进程优先级 是动态优先级;NI nice负值表示高优先级,静态优先级一般不变;
# VIRT进程使用的虚拟内存总量VIRT=SWAP+RES,申请过的内存没有真正分配物理内存也会计算在内,进程的虚拟内存比常驻内存大得多;
# RES进程实际使用的、未被换出的物理内存大小,即不包括Swap和共享内存,单位kb
# SHR共享内存大小,单位kb
# S进程状态,D不可中断的睡眠状态,R运行,S睡眠,T停止,Z僵尸进程,%CPU上次更新到现在的CPU时间占用百分比
# %MEN进程使用的物理内存百分比,TIME+进程使用的CPU时间总计,单位1/100秒;COMMAND进程名(命令名/命令行)
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
740 root 20 0 1053844 35124 14632 S 0.5 0.9 0:18.49 containerd
1 root 20 0 128064 6660 4152 S 0.0 0.2 0:00.86 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
5 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/u8:0
6 root 20 0 0 0 0 S 0.0 0.0 0:00.32 ksoftirqd/0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 S 0.0 0.0 0:11.79 rcu_sched
7、OOM导致进程被杀死
(1)查看被杀死的进程日志
Linux系统在内存不足等条件下会主动干预进程(OOM-Killer机制)。
OOM killer给进程打分,把oom_score最大的进程先杀死,打分主要有两部分组成:一种是系统根据该进程的内存占用情况打分,进程的内存开销是变化的,所以该值也会动态变化;另一种用户可以设置oom_score_adj,范围是-1000到1000。
# 查看系统日志,筛选出主动kill的操作
tail -f /var/log/messages
cat /var/log/messages | grep kill
# 用dmesg查看,包含内核缓冲信息,在系统启动时,会在屏幕上显示许多与硬件有关的信息
# egrep 详细:-i忽略大小写 -C n key 输出匹配key关键字及关键字上下的n行
# 过滤出killed process上下10行日志
dmesg | egrep -i -C10 'killed process'
# 增加人类可读的时间戳
dmesg -T
# 常用完整命令
dmesg -T | egrep -i -C10 'killed process'
(2)什么是oom_score
对某一个task进程进行打分(oom_score),实际得分需要考虑两个方面,然后把oom_score最大的进程先杀死。
1、一部分是系统打分,主要是根据该task的内存使用情况,进程的内存开销是变化的,所以该值也会动态变化。
2、另一部分是用户打分,也就是oom_score_adj,默认是0,取值范围是-1000~1000。
0表示用户不调整oom_score,负值表示要在实际打分值上减去一个折扣;正值表示要惩罚对应的进程,也就是增加该进程的oom_score;如果用户将该进程的oom_score_adj设定成-1000,表示禁止OOM killer杀死该进程,特别重要的服务可以配置。
#注意,proc文件系统是虚拟文件系统,某个进程被杀掉,则/proc/pid目录也就被销毁。
#在对应的目录下,有一个oom_score与oom_score_adj文件,就是我们说的上面那两个得分。
# 查看得分
cat /proc/{pid}/oom_score
cat /proc/{pid}/oom_score_adj
# 手动修改得分,改完之后,对应的两个得分就会变化
sudo sh -c "echo -500 > /proc/{pid}/oom_score_adj"
# 如果把一个一直申请内存的进程oom_score_adj设置为-1000,会导致大量的进程 都被kill,非常危险。
sudo sh -c "echo -1000 > /proc/{pid}/oom_score_adj"
8、Buffer/cache详解
(1)简介
在Linux的内存管理中,buffer和cache是为了提高IO性能,由OS管理,是两个不同的概念。
Buffer指Linux内存的Buffer cache(缓冲区)。
用内存和硬盘的缓冲,是在向硬盘写入数据时,先把数据放入缓冲区,然后再一起向硬盘写入,把分散的写操作集中进行;
存放要输出到disk磁盘(块存储)的数据,对磁盘块的读写,用来缓存磁盘的数据,不会特别大,常规就是几十MB;
操作系统内核把分散的写集中起来,把多次小的写合并成单次大的写,减少磁盘碎片和硬盘的反复寻道提高写入速度。
buffers:Memory used by kernel buffers(Buffers in /proc/meminfo),内核缓冲区的内存,是/proc/meminfo中的Buffers值。
Cache指Linux内存中的Page cache(缓存区)。
用于CPU和内存之间的缓冲,用来缓存从磁盘文件读取的数据,下次访问这些文件数据时,直接从内存中获取,不用再次访问缓慢的硬盘;
一般来说,cache会比buffers的数量大很多,频繁访问到的文件都被cache,那磁盘的读IO会非常小;
Cache不是缓存文件的,是缓存块的(块是IO读写最小的单元),一般会用在IO请求上;
在Linux系统中程序频繁读写文件后,可用物理内存会很少,Cache Memory在需要使用内存的时候会自动释放,不比担心没有内存可用;
如果多个进程要访问某个文件,把此文件读入Cache中,下次获取CPU控制权读取文件直接从Cache读取,提高性能。
cache:Memory used by the page cache and slabs(Cached and SReclaimable in /proc/meminfo),页缓存和Slab用到的内存,是/proc/meminfo中的Cached和Slab之和。
[root@localhost 191]# cat /proc/meminfo
MemTotal: 3879952 kB
MemFree: 2780288 kB
MemAvailable: 2990156 kB
Buffers: 2068 kB
Cached: 401704 kB
SwapCached: 0 kB
Active: 625936 kB
Inactive: 332528 kB
Active(anon): 554996 kB
Inactive(anon): 8552 kB
Active(file): 70940 kB
Inactive(file): 323976 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 2097148 kB
SwapFree: 2097148 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 554692 kB
Mapped: 91876 kB
Shmem: 8856 kB
Slab: 71404 kB
SReclaimable: 35292 kB
SUnreclaim: 36112 kB
KernelStack: 3984 kB
PageTables: 6588 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 4037124 kB
Committed_AS: 1930644 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 11388 kB
VmallocChunk: 34359724032 kB
Percpu: 912 kB
HardwareCorrupted: 0 kB
AnonHugePages: 473088 kB
CmaTotal: 0 kB
CmaFree: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 65472 kB
DirectMap2M: 4128768 kB
(2)进一步解释
Buffer是对磁盘数据的缓存,Cache是文件数据的缓存,两者既会用在读请求,也会用在写请求,只不过是多和少的区别。
缓冲(buffer)是用来加速数据“写入”硬盘,保存即将要写入到磁盘上的数据;
缓存(cache)是保存从磁盘上读出的数据,用来加速数据从硬盘中“读取”。
Cache和Buffer是为了解决高速设备和低速设备之间的问题而设计的中间层,通过“流量整形”提高系统性能。 Cache将低速设备中常被访问的数据缓存起来,当高速设备需要再次访问这些数据时,命中Cache中的数据,以减少对低速设备的访问。 Buffer用于缓冲高速设备把数据写到低速设备时带来的压力,当数据量比较大时,Buffer能将数据分割成合适的大小,分批写回到磁盘;当数据量比较小的时候,Buffer能将分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道。
(3)手动释放
Linux系统频繁存取文件会导致物理内存被用光,buffer/cache缓存使用后并不会马上释放,就会造成buffers和cached占用过高。
buffers/cache占用的较多,但是不要紧,这部分内存是当空闲来用的。avaliable = free + buffer/cache。
为什么操作系统不会主动回收呢?因为drop_caches的默认参数设置的就是不释放的。
# 用命令来释放缓存,建议先执行sync命令,将所有未写的系统缓冲区写到磁盘中,包含已修改的i-node、延迟的块IO等
# 默认0:不释放(系统默认值)
[root@localhost 191]# cat /proc/sys/vm/drop_caches
0
# 同步
sync
# 1:释放页缓存
echo 1 > /proc/sys/vm/drop_caches
# 2:释放dentries和indodes,即清除回收slab分配器中的对象
echo 2 > /proc/sys/vm/drop_caches
# 3:释放所有缓存
echo 3 > /proc/sys/vm/drop_caches
# 查看
[root@localhost 191]# cat /proc/sys/vm/drop_caches
3
【重磅推荐!免费简单内网穿透神器!支持linux+windows】
推荐内网穿透神器【cpolar】www.cpolar.com/ 点击【免费注册】之后,输入自己的个人信息就可以注册一个账号啦! 本地web项目如何使用外网访问?教你轻松使用cpolar在windows搭建内网穿透 linux虚拟机部署的web项目如何使用外网访问?教你轻松使用cpolar在centos搭建内网穿透 linux虚拟机部署的MySQL如何使用外网访问?教你轻松使用cpolar在centos搭建内网穿透
找工作难?来【万码优才】!专为程序员准备的招聘盛宴
#小程序://万码优才/t8mdtmZFcnqqzPu
大家找工作也可以试一下【万码优才】这个小程序,挺好用的,多一个选择多一份择业机会~
我看了一下,岗位挺多的,只需要完善简历找到想要的岗位,进行投递即可!