首页 > 系统相关 >夯实基础之内存回收

夯实基础之内存回收

时间:2022-10-17 15:14:58浏览次数:44  
标签:回收 夯实 匿名 内存 进程 磁盘 proc

内核在给应用程序分配物理内存的时候,如果空闲物理内存不够,那么就会进行内存回收的工作,主要有两种方式:

后台内存回收:在物理内存紧张的时候,会唤醒 kswapd 内核线程来回收内存,这个回收内存的过程异步的,不会阻塞进程的执行。
直接内存回收:如果后台异步回收跟不上进程内存申请的速度,就会开始直接回收,这个回收内存的过程是同步的,会阻塞进程的执行。
可被回收的内存类型有文件页和匿名页:

文件页的回收:对于干净页是直接释放内存,这个操作不会影响性能,而对于脏页会先写回到磁盘再释放内存,这个操作会发生磁盘 I/O 的,这个操作是会影响系统性能的。
匿名页的回收:如果开启了 Swap 机制,那么 Swap 机制会将不常访问的匿名页换出到磁盘中,下次访问时,再从磁盘换入到内存中,这个操作是会影响系统性能的。
文件页和匿名页的回收都是基于 LRU 算法,也就是优先回收不常访问的内存。回收内存的操作基本都会发生磁盘 I/O 的,如果回收内存的操作很频繁,意味着磁盘 I/O 次数会很多,这个过程势必会影响系统的性能。

针对回收内存导致的性能影响,常见的解决方式。

设置 /proc/sys/vm/swappiness,调整文件页和匿名页的回收倾向,尽量倾向于回收文件页;
设置 /proc/sys/vm/min_free_kbytes,调整 kswapd 内核线程异步回收内存的时机;
设置 /proc/sys/vm/zone_reclaim_mode,调整 NUMA 架构下内存回收策略,建议设置为 0,这样在回收本地内存之前,会在其他 Node 寻找空闲内存,从而避免在系统还有很多空闲内存的情况下,因本地 Node 的本地内存不足,发生频繁直接内存回收导致性能下降的问题;
在经历完直接内存回收后,空闲的物理内存大小依然不够,那么就会触发 OOM 机制,OOM killer 就会根据每个进程的内存占用情况和 oom_score_adj 的值进行打分,得分最高的进程就会被首先杀掉。

我们可以通过调整进程的 /proc/[pid]/oom_score_adj 值,来降低被 OOM killer 杀掉的概率。

标签:回收,夯实,匿名,内存,进程,磁盘,proc
From: https://www.cnblogs.com/aiverhua/p/16799224.html

相关文章

  • 为什么Linux需要虚拟内存 [转载好文]
    操作系统中的CPU和主内存(Mainmemory)都是稀缺资源,所有运行在当前操作系统的进程会共享系统中的CPU和内存资源,操作系统会使用CPU调度器分配CPU时间1并引入虚拟内存......
  • 内存空间和内存地址
    内存地址:一个编号表示一个内存空间内存空间:计算器中存储器的容量是以字节(Byte)为单位,也就是说一个内存地址代表一个字节(8bit)的存储空间(1Byte==8bit)bit:位Byte:......
  • 第二季:6.GC垃圾回收算法和垃圾收集器的关系?分别是什么请你谈谈【Java面试题】
    第二季:6.GC垃圾回收算法和垃圾收集器的关系?分别是什么请你谈谈【Java面试题】​​前言​​​​推荐​​​​6.GC垃圾回收算法和垃圾收集器的关系?分别是什么请你谈谈​​​......
  • C++内存泄漏
        程序在堆中申请的动态内存,在程序使用完成时没有得到及时的释放。当这些变量的生命周期已结束时,该变量在堆中所占用的内存未能得到释放,从而就导致了堆中可使用的......
  • jvm-1.内存结构
    内存结构1.程序计数器1.1定义ProgramCounterRegister程序计数器(寄存器)作用,是记住下一条jvm指令的执行地址特点:是线程私有的不会存在内存溢出1.2......
  • 内存泄漏
    内存泄漏:当应用程序请求使用一段内存时,操作系统会为其分配特定的内存空间。当应用程序使用完内存后,应该通知操作系统释放内存,以便其他应用程序继续使用。但有些应用程序编......
  • 动态内存分布
    在C中,不同数据在内存中分配说明: 动态内存分配的相关函数:   void*只是提供一个纯地址,不指向任何数据,如下图的*p3void指针类型: 即指针类型为void,不能用*p的......
  • Flink内存模型
    一、内存布局1、直观图2、树状图 二、内存解释1、Flink使用的内存(1)JVM堆上内存说明:堆上内存管理序列化之后的数据,如果需要处理的数据超出了内存限制,则会将部......
  • C/C++ 为什么要使用动态内存?
    为什么要使用动态内存?1.按需分配,根据需要分配内存,不浪费;2.被调用函数之外需要使用被调用函数内部的指针对应的地址空间;3.突破栈区的限制,可以给程序分配更多的内存......
  • C++程序的内存分区
    1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量值等。2、堆区(heap):一般由程序员分配释放,随叫随到,挥之即走。3、全局/静态区(static):全局变量和静态变量的存储是......