一、什么时候回收内存?

1、直接内存回收

有新的大块内存分配请求,但是剩余内存不足。这个时候系统就需要回收一部分内存,进而尽可能地满足新内存请求。

2、定期扫描回收(kswapd)

操作系统内核线程kswapd定期进行回收内存,并通过设定三个内存阈值来衡量内存的使用情况,分别是

  • 页最小阈值(pages_min)
  • 页低阈值(pages_low)
  • 页高阈值(pages_high)

kswapd定期扫描内存的使用情况,并根据剩余内存落在这三个阈值的空间位置,进行内存的回收操作。

1)free < pages_min:说明进程可用内存都耗尽了,触发直接内存回收,此时只有内核才可以分配内存

2)pages_min<free<pages_low:说明内存压力比较大,剩余内存不多了。这时 kswapd会执行内存回收,直到剩余内存大于高阈值为止。

3)pages_low<free<pages_high:说明内存有一定压力,但还可以满足新内存请求。

4)free>pages_high:说明剩余内存比较多,没有内存压力。

二、回收的方式

1、对于缓存和缓冲区的内存回收

1)对文件页的回收,直接回收缓存

2)对脏页的回收,写回磁盘后再回收。

2、基于 Swap 机制,回收不常访问的匿名页(应用程序动态分配的堆内存),通过 Swap 机制,把它们写入磁盘后再释放内存。

3、oom机制进行回收

三、相关参数调整

1、内核参数vm.swappiness,决定回收缓存或swap机制回收内存的倾向

取值范围是 0-100,

数值越大,越积极使用 Swap,也就是更倾向于回收匿名页;

数值越小,越消极使用 Swap,也就是更倾向于回收文件页。

0不代表不使用swap,当剩余内存 + 文件页小于页高阈值时,还是会发生 Swap。

2、内核参数vm.min_free_kbytes,调整内存水位

pages_min = min_free_kbytes换算为page单位,

pages_low = pages_min*5/4

pages_high = pages_min*3/2

3、oom机制

1)vm.panic_on_oom:

  • 0:当内存耗尽时,内核会触发OOM killer杀掉最耗内存的进程。
  • 1:表示关闭此功能,内核直接panic

2)vm.oom_kill_allocating_task

  • 0:内核检查每个进程的分数,分数最高的进程将被kill掉
  • 1:内核将kill掉当前申请内存的进程

linux内存-内存回收相关推荐

  1. linux kernel内存回收机制

    http://www.wowotech.net/linux_kenrel/233.html 无论计算机上有多少内存都是不够的,因而linux kernel需要回收一些很少使用的内存页面来保证系统持续有 ...

  2. Problem 64 如何设置Linux系统内存回收的阀值?

    Problem 64 如何设置Linux系统内存回收的阀值? Ans: Linux内核的策略是最大程度的利用内存cache 文件系统的数据,提高IO速度,虽然在机制上是有进程需要更大的内存时,会自动释 ...

  3. 【Linux 内核 内存管理】物理分配页 ⑧ ( __alloc_pages_slowpath 慢速路径调用函数源码分析 | 获取首选内存区域 | 异步回收内存页 | 最低水线也分配 | 直接分配 )

    文章目录 一.获取首选内存区域 二.异步回收内存页 三.最低水线也分配 四.直接分配内存 在 [Linux 内核 内存管理]物理分配页 ② ( __alloc_pages_nodemask 函数参数分 ...

  4. Linux内存管理回收机制

    Linux内存管理回收机制 1.Linux内存管理简介     Linux将所管理的内存划分为内存节点(node).内存分区(zone)和页框(page). 1.1.内存节点(node)     依据 ...

  5. Linux的内存回收和交换

    前言 Linux的swap相关部分代码从2.6早期版本到现在的4.6版本在细节之处已经有不少变化.本文讨论的swap基于Linux 4.4内核代码.Linux内存管理是一套非常复杂的系统,而swap只 ...

  6. linux回收内存的方法,linux释放内存的方法

    Linux 释放内存方法 先看看内存使用状况 [root@node1 ~]# free -m total used free shared buffers cached Mem: 8004 6557 ...

  7. Linux堆内存管理深入分析(上)

    Linux堆内存管理深入分析 (上半部) 作者:走位@阿里聚安全   0 前言 近年来,漏洞挖掘越来越火,各种漏洞挖掘.利用的分析文章层出不穷.从大方向来看,主要有基于栈溢出的漏洞利用和基于堆溢出的漏 ...

  8. 转:浅谈Linux的内存管理机制

    一 物理内存和虚拟内存          我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概 ...

  9. JVM 与 Linux 的内存关系详解

    来源:美团技术团队 在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 600m,Linux自身使用大约800m. ...

最新文章

  1. JDK8:使用Optional进行变量判空、集合遍历
  2. 恢复Oracle误删数据一点小记
  3. 龙门吊matlab,龙门吊车重物防摆双闭环PID控制设计.doc
  4. 【原创视频】Docker总体架构设计及各模块原理剖析
  5. web性能压测——webbench
  6. python抓取贴吧_python抓取百度贴吧-校花吧,网页图片
  7. mysql df_DF学Mysql(一)——数据库基本操作
  8. Unitest框架的使用(一)准备工作,接口定义和Unittest方法
  9. 程序人生,程序猿要把编程一直学习下去吗?
  10. 【LeetCode-面试算法经典-Java实现】【012-Integer to Roman(数字转罗马字符)】
  11. 尚学堂高淇python课件代码_尚学堂高淇Python400集全套视频教程百度云网盘分享
  12. 计算机视觉目标检测算法综述
  13. 仓央嘉措---不负如来不负卿---问佛--见与不见
  14. CSAPP:第四章——处理器体系结构(上)
  15. 电动汽车热管理粘合剂和密封剂市场现状及未来发展趋势
  16. facebook第三方登录前后端分离
  17. 互联网寒冬!docker安装nacos集群
  18. Neuron:自动优化TMS线圈放置,实现个性化靶向功能网络刺激
  19. java网络编程的三要素
  20. JDK8 超详细,肝

热门文章

  1. 现在最好玩的AI竟然来自一个家谱公司???
  2. Microsoft SQL Server Management Studio附加数据库时出错。有关详细信息,请单击“消息”列中的超链接。
  3. 简单区分快速格式化和格式化
  4. hdu6740 MUV LUV EXTRA KMP算法
  5. java 操作 User32 的一次小尝试
  6. iframe 传递参数问题
  7. OpenGL粒子系统详解及编程实现
  8. c语言textout字体大小,textout函数怎么用
  9. SSL漏洞 TLS/SSL Sweet32 attack || TLS/SSL Wrak Cipher Suites[解决]
  10. O-C和C的差别以及其自身的特点