内存满了如何处理?

news2024/12/25 10:27:45

目录

虚拟内存

内存分配过程

直接内存回收和后台内存回收

回收内存的触发标准

那些内存被回收呢?

内存回收后,内存还是不够怎么办呢?


虚拟内存

介绍操作系统内存如何使用时,不可以避免的先认识到虚拟内存

首先我们通过虚拟内存的作用,来认识一下:

1.虚拟内存可以使得进程对运行内存超过物理内存大小,因为程序运行符合局部性原理,CPU 访问内存会有很明显的重复访问的倾向性,对于那些没有被经常使用到的内存,我们可以把它换出到物理内存之外,比如硬盘上的 swap 区域。

我们为一个进程分配内存时,分配的是一个虚拟内存,如果我们分配的是物理内存那么,当这个进程大部分东西没有被使用时,就造成了内存的浪费,所以当我们真正使用时才分配真实的物理内存

2.由于每个进程都有自己的页表,所以每个进程的虚拟内存空间就是相互独立的。进程也没有办法访问其他进程的页表,所以这些页表是私有的,这就解决了多进程之间地址冲突的问题。

物理地址是虚拟地址通过页表映射而来的,每个进程都有自己的页表,

那么每个进程访问真实的物理地址互不干扰,因为中间隔着虚拟地址

3.页表里的页表项中除了物理地址之外,还有一些标记属性的比特,比如控制一个页的读写权限,标记该页是否存在等。在内存访问方面,操作系统提供了更好的安全性。

避免了用户态直接访问内核态的物理地址

内存分配过程

直接内存回收和后台内存回收

当使用malloc动态的分配内存时,我们知道哪分配的是虚拟内存,而不是真实的物理内存

当应用程序读写了这块虚拟内存,CPU 就会去访问这个虚拟内存,

这时会发现这个虚拟内存没有映射到物理内存, CPU 就会产生缺页中断,

进程会从用户态切换到内核态,保存现场(保存PC指针)和上下文,

并将缺页中断交给 内核的缺页中断函数 处理。缺页中断处理函数会看是否有空闲的物理内存,

如果有,就直接分配物理内存,并建立虚拟内存与物理内存之间的映射关系

如果没有空闲的物理内存,那么内核就会开始进行回收内存的工作

回收的方式主要是两种:直接内存回收后台内存回收。         

后台内存回收:

后台内存回收:在物理内存紧张的时候

会唤醒 kswapd 内核线程来回收内存,这个回收内存的过程异步的,不会阻塞进程的

直接内存回收:   如果后台异步回收跟不上进程内存申请的速度,就会开始直接回收,

这个回收内存的过程是同步的,会阻塞进程的执行。(阻塞申请内存的那个进程)

影响:造成很长时间的延迟,以及系统的 CPU 利用率会升高,最终引起系统负荷飙高。

回收内存的触发标准

下面用图解释

当然你可以调整这个阈值的大小,从而尽早的运行后台内存回收,从而避免内存紧张

那些内存被回收呢?

主要有两类内存可以被回收,而且它们的回收方式也不同。

文件页:内核缓存的磁盘数据和内核缓存的文件数据都叫作文件页。

大部分文件页,都可以直接释放内存,以后有需要时,再从磁盘重新读取就可以了。

而那些被应用程序修改过,并且暂时还没写入磁盘的数据(也就是脏页),

就得先写入磁盘,然后才能进行内存释放。

所以,回收干净页的方式是直接释放内存回收脏页的方式是先写回磁盘后再释放内存


匿名页:这部分内存没有实际载体,不像文件缓存有硬盘文件这样一个载体,比如堆、栈数据等。这部分内存很可能还要再次被访问,所以不能直接释放内存,

它们回收的方式是通过 Linux 的 Swap 机制,Swap 会把不常访问的内存先写到磁盘中,

然后释放这些内存给其他更需要的进程使用。再次访问这些内存时重新从磁盘读入内存就可以了。

文件页内存页 又依靠什么机制来淘汰呢?

MySQL如何改进LRU算法-CSDN博客

哪当然是Linux的LRU,类似我这篇博客里MySQL的LRU算法,

Linux的LRU 分为两个链表 一个活跃链表, 一个非活跃链表

所以当我们 回收时 就从非活跃链表 淘汰页(把这些页从内存中淘汰,下次调用从磁盘拿)

内存回收后,内存还是不够怎么办呢?

触发 OOM (Out of Memory)机制

OOM Killer 机制会根据算法选择一个占用物理内存较高的进程,然后将其杀死,

以便释放内存资源,如果物理内存依然不足

OOM Killer 会继续杀死根据算法选择占用物理内存较高的进程,直到释放足够的内存位置。

算法:

1. 进程使用的物理内存量:

// points 代表打分的结果
// process_pages 代表进程已经使用的物理内存页面数
// oom_score_adj 代表 OOM 校准值
// totalpages 代表系统总的可用页面数
points = process_pages + oom_score_adj*totalpages/1000

2.特权进程的评分:特权进程通常较为重要,因此将其得分设置为1/4。例如守护进程  (1号进程)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1615091.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基础SQL DML-插入语句

插入语句前,我们先创建一个表。表的创建在DDL语句里面涉及,可以参考:小赖同学吖-CSDN博客 我们创建一个员工表进行数据的插入操作 插入(添加)语句的语法 给员工表添加一条记录 给员工表添加多条记录 也可以通过下面的方…

Python 面向对象——2.类与对象实例属性补充解释,self的作用等

本章学习链接如下: Python 面向对象——1.基本概念 实例的属性 1.创建对象 在上一小节的学习中我们提到了类中的变量与函数变量的区别,self.param1和param1,接下来我们继续详细解释这个知识点。 当我们创建一个学生的类,比如…

铜缆与网线:数字时代的信息高速公路

在现代社会,信息传输已成为日常生活的重要部分。从个人通信到全球数据中心,铜缆和网线扮演着至关重要的角色。本文将详细介绍铜缆和网线的类型、特点以及它们在数字时代的应用。 铜缆的种类与应用 铜缆的类型 UTP(无屏蔽双绞线)&…

登录的几种方式

一、session 1、客户端发送请求,服务器将登录信息存储在 Session 中,Session 依赖于 Cookie(cookie指的就是在浏览器里面存储的一种数据,仅仅是浏览器实现的一种数据存储功能。Cookie实际上是一小段的文本信息。)&…

Arthas介绍及使用技巧

文章目录 简介能做什么? 使用下载并启动arthas选择应用 java 进程退出 arthas 常用查看命令帮助查看 dashboard通过 thread 命令来获取到线程的栈通过 jad 来反编译 Classwatch 查看方法出入参、sc 搜索类: 查看已加载类所在的包monitor 方法执行监控trace 方法内调…

牛客NC238 加起来和为目标值的组合【中等 DFS C++、Java、Go、PHP】

题目 题目链接: https://www.nowcoder.com/practice/172e6420abf84c11840ed6b36a48f8cd 思路 本题是组合问题,相同元素不同排列仍然看作一个结果。 穷经所有的可能子集,若和等于target,加入最终结果集合。 给nums排序是为了方便…

day04 51单片机-矩阵按键

1 矩阵按键 1.1 需求描述 本案例实现以下功能:按下矩阵按键SW5到SW20,数码管会显示对应的按键编号。 1.2 硬件设计 1.2.1 硬件原理图 1.2.2 矩阵按键原理 1.3软件设计 1)Int_MatrixKeyboard.h 在项目的Int目录下创建Int_MatrixKeyboard.h,写入以下内容。 #ifndef __…

Pyhton Sqlite3手机数据库

代码结果 Code import sqlite3 connsqlite3.connect(test.db) csconn.cursor() create_tb_sqlcreate table if not exists info(id int primary key,name text,age int)cs.execute(create_tb_sql)# cs.execute(insert into info(id,name,age) values(3,"dog_Senior&quo…

Ubuntu Server 20.04 LTS 64bit安装ftp服务

1.安装vsftpd sudo apt install vsftpd2.配置vsftpd sudo vim /etc/vsftpd.conf write_enableYES # 启用任何形式的FTP写入命令,即可以修改文件local_umask022 # 本地用户创建文件的 umask 值,默认是被注释的connect_from_port_20YES # 针对 PORT 类型…

java 溯本求源之基础(十八)之Monitoring--jmc

1.JMC概述 JMC全称Java Mission Control,集成了多个功能强大的组件,其中最核心的两部分是管理控制台和Java Flight Recorder。管理控制台允许开发者实时监控应用的运行状态,捕捉各种性能指标;而Java Flight Recorder则提供了一种高…

深兰科技入选2024全国“人工智能+”行动创新案例TOP100

近日,中科院《互联网周刊》联合eNET研究院、德本咨询、中国社会科学院信息化研究中心共同发布了《2024全国“人工智能”行动创新案例TOP100》榜单。经评委会层层遴选,深兰科技专为洛阳市打造的“工业智能化洛阳中心”项目成功入围该榜单。一同入围的还包…

力扣(leetcode) 407. 接雨水 II 3D接雨水

力扣(leetcode) 407. 接雨水 II 3D接雨水 给你一个 m x n 的矩阵,其中的值均为非负整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水。 示例 1: 输入: heightMap [[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]] 输…

IEC104协议

1. 简介 IEC104规约是一个广泛应用于电力、城市轨道交通等行业的国际标准。 2. 术语解释 遥脉 (电度量): 是指对现场某装置所发出的脉冲信号进行周期累计的一种远程计数操作。 其实,遥脉也可以看成是被具体规定了采用脉冲计数作为测量方法的一种遥测…

日本二次元团建国内院线:一周一部,占据36.2%票房

从《你想活出怎样的人生》开始,到《哈尔的移动城堡》结束,日本动画正在占据国内院线的整个4月份档期。 包括《数码宝贝02:最初的召唤》、《间谍过家家 代号:白》多部作品在内,整个国内四月份院线日本动画平均一周上映…

分布式锁(Redis)

一、序言 本文和大家聊聊分布式锁以及常见的解决方案。 二、什么是分布式锁 假设一个场景:一个库存服务部署在上面三台机器上,数据库里有 100 件库存,现有 300 个客户同时下单。并且这 300 个客户均摊到上面的三台机器上(即三台…

4套java智慧型管理系统源码-智慧校园-智慧工地-智慧城管-智慧3D导诊

第一套:Java智慧校园系统源码 智慧学校源码 微信小程序电子班牌 智慧校园系统简介: 智慧校园的建设逐渐被师生、家长认可接受,智慧校园通过对在校师生、教务等所有人员的信息以及各种信息搜集与储存,进行数据优化与管理&#xf…

信息系统项目管理师0057:运维管理(4信息系统管理—4.2管理要点—4.2.2运维管理)

点击查看专栏目录 文章目录 4.2.2运维管理1.能力模型2.智能运维4.2.2运维管理 IT运维是组织IT服务中关键的一种类型。随着组织IT建设的不断深入和完善,信息系统运维已经成为了各行各业各组织管理者和IT团队普遍关注的问题。IT运维是指采用IT手段及方法,依据服务对象提出的服务…

代码学习记录49---单调栈

随想录日记part49 t i m e : time: time: 2024.04.20 主要内容:今天开始要学习单调栈的相关知识了,今天的内容主要涉及:柱状图中最大的矩形 84.柱状图中最大的矩形 Topic184.柱状图中最大的矩形 题目&…

一线实战:国产数据库Mogdb双网卡同步最佳实践

前言 大家都知道Oracle数据库无论是单机还是RAC集群在进行生产部署实施时,我们都会对网卡做冗余考虑,使用双网卡,比如public、心跳网络。这样的目的主要是为了安全,避免单点故障。当然双网卡Bond不仅是可以做主备还可以支持负载均…

问题总结笔记

1.向量旋转 问题: 将一个向量旋转90 方法:旋转矩阵 FVector FrontDir EndMousePoint - Point; FrontDir.Normalize(); FVector Left FVector(-FrontDir.Y, FrontDir.X, 0); Verties.Add(Point Left * (WallWedith / 2)); Verties.Add(FVector(Vertie…