Linux 内存:物理内存和虚拟内存

/proc/meminfo内容详解 MemTotal: 498364224 kB MemFree: 341371712 kB MemAvailable: 431430528 kB Buffers: 3456 kB Cached: 89801856 kB SwapCached: 0 kB Active: 36263872 kB Inactive: 78312192 kB Active(anon): 24965120 kB . 阅读详情

前言: 内存是linux中很重要的一块,内存不足、内存泄漏、内存溢出也是在测试项目中经常会遇到的问题。

1. 物理内存和虚拟内存

内存的读写性能要比硬盘快的多,因此,在设计上会充分利用内存进行数据的读取和写入,提高性能,但是内存是有限的,这就引入了物理内存和虚拟内存的概念。

物理内存指通过物理内存条而获得的内存空间,称为RAM。而虚拟内存则是指将硬盘的一块区域划分来作为内存。

Linux 的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。

内存主要作用是在计算机运行时为操作系统和各种程序提供临时储存。当物理内存不足时,可以用虚拟内存代替。虚拟内存的概念,是为了满足物理内存不足的情况下,利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(swap space)。vm.swappiness是Linux内核的一个参数,范围是0~100。它表示实际内存和虚拟内存区域进行数据交换的倾向性大小,数值越大表示倾向性越大,即交换的页面文件越多,反之亦然。一般默认值为60。可用'cat /proc/sys/vm/swappiness’查看。

Linux会在物理内存不足的时,使用交换分区的虚拟内存,也就是说,内核会将暂时不用的内存块信息写到交换空间,以释放物理内存。Linux的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。swap si/so 交换区的换进换出。

所有的进程都需要内存,但是不是每个进程都需要一直将对象加载到内存中。基于这点,kernel通过将进程的部分或全部内存换出到磁盘上,来释放物理内存,直到需要再次使用,然后再次读到内存中。kernel采用分页和交换进行内存管理。其中:

si:将分页被重新读取到物理内存。也称作page-in

so:将内存的要交换的分页写到磁盘上。也称作page-out

有时我们会看到这么一个现象,Linux 物理内存还有很多,但是交换空间也使用了很多,其实这并不奇怪。例如,一个占用很大内存的进程运行时,需要耗费很多内存资源,此时就会有一些不常用页面文件被交换到虚拟内存中,但后来这个占用很多内存资源的进程结束并释放了很多内存时,刚才被交换出去的页面文件并不会自动交换进物理内存(除非有这个必要),那么此时系统物理内存就会空闲很多,同时交换空间也在被使用,就出现了刚才所说的现象了。

最后,交换空间的页面在使用时会首先被交换到物理内存,如果此时没有足够的物理内存来容纳这些页面,它们又会被马上交换出去,如此一来,虚拟内存中可能没有足够的空间来存储这些交换页面,最终会导致 Linux 出现假死机、服务异常等问题。Linux 虽然可以在一段时间内自行恢复,但是恢复后的系统己经基本不可用了。

因此,合理规划和设计 Linux 内存的使用是非常重要的,关于物理内存和交换空间的大小设置问题,取决于实际所用的硬盘大小,但大致遵循这样一个基本原则:

  1. 如果内存较小(根据经验,物理内存小于 4GB),一般设置 swap 分区大小为内存的 2 倍;
  2. 如果物理内存大于 4GB,而小于 16GB,可以设置 swap 分区大小等于物理内存;
  3. 如果内存大小在 16GB 以上,可以设置 swap 为 0,但并不建议这么做,因为设置一定大小的 swap 分区是有一定作用的。

2. Buffer与Cache

buffer 和 cache都是通过使用物理内存的一部分,其中A buffer is something that has yet to be "written" to disk. A cache is something that has been "read" from the disk and stored for later use.

但是我们平常对系统资源进行监控时看到的buffer cache,其实都是cache,其中,buffer是buffer cache,cache是page cache,例如free命令中展示的结果:

Mem是物理内存统计,如上面显示的,total表示物理内存总量是8006M,used表示总计分配给缓存(包括buffers和cached的)使用的数量,但其中可能部分缓存并未实际使用。used使用的内存有7253M,free未被分配的内存为752M,共享内存shared 一般系统不会用到,总是0。Buffer是系统分配但未被使用的buffer数量有183M,cache是系统分配但未被使用的cache数量有5153M,关系:total(8006M) = used(7253M) + free(752M),除去buffer和cache,真正使用的内存即-/+ buffers/cache中显示的used的值,也就是1934M。即下面的关系:

(-buffers/cache) used内存数:1934M (指的第一部Mem行中的used–buffers– cached) (+buffers/cache) free内存数: 6071M (指的第一部分Mem行中的free + buffers + cached) 所以-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是可以挪用的内存总数。

3. Linux下的内存的监控方法

1)free命令查看内存

在linux下用free –help查看使用规则,详见1.2节

参数:

-b  以Byte为单位显示内存使用情况。

-k  以KB为单位显示内存使用情况。

-m  以MB为单位显示内存使用情况。

-o  不显示缓冲区调节列。

-s<间隔秒数>  持续观察内存使用状况。

-t  显示内存总和列。

-V  显示版本信息。

2) vmstat命令查看内存

vmstat 1 【Virtual Meomory Statistics(虚拟内存统计)】命令查看内存使用情况:

3) sar命令

sar –R和sar –r可以用来监控内存问题

参考:

Linux虚拟内存和物理内存

Linux 是怎样使用内存的? - 知乎

Linux内存管理 内存管理是一个比较大的概念,大家可能在各个地方都会遇到,无论语言中的内存管理、操作系统中的内存管理、数据结构中的内存管理。虽说它们都是对于内存的管理,但是唯独不同的是它们前面的定语不同以及立场不同。比如说数据结构中的内存管理主要关注的是内存管理的方式以及方法,它说关注的并不是内存,它并不管这个内存是物理的还是虚拟的还是堆内存什么的。总的来说它并不在乎对象是什么,而在乎的是管理上的方法。而操作系统中的 阅读详情

相关推荐

手把手教你驱动6脚三位一体数码管:从引脚分析到C语言扫描代码实战

本文详细解析了如何逆向工程并驱动6脚三位一体数码管的全过程,从引脚分析到C语言扫描代码实战。通过系统化的测试和优化,作者总结出一套高效的驱动架构和调试方法,适用于工业设备中的非标准数码管应用。

weixin_42632434的博客 213

Linux 物理内存、虚拟内存

物理内存和虚拟内存电脑里内存分内存条(这里我们叫物理内存)和硬盘,内存条保存程序运行时数据,也称为物理内存,硬盘持久保存数据。在进程的执行过程当中,Linux会根据内核需要,分配一片内存区域,进程会将这片区域当成工作区。然后按照要求去执行这些操作。那么虚拟内存是什么?程序运行会启动一个进程,进程里有程序段、全局数据、栈和堆,这些都会加载到内存里,每一部分都有对应的内存地址,进程就是一直在处理这些地址中数据。然而在Linux下,进程不能直接读写物理内存地址(它不能直接读取内存条对应的地址)。进程中能访问的地址

小楼一夜听春雨,深巷明朝卖杏花 1189

n8n 快速入门1:构建一个简单的工作流

n8n 快速入门指南

engchina的专栏 1万+

/proc/meminfo 解析

meminfo

Fogo_XD的博客 4146

告别裸机SPI!用HAL库和CubeMX重新玩转STM32与MAX6675温度传感器

本文详细介绍了如何利用STM32CubeMX和HAL库高效驱动MAX6675温度传感器,实现稳定可靠的热电偶温度监测系统。通过图形化配置SPI接口和封装专用驱动函数,开发者可以快速构建嵌入式温度测量方案,适用于工业控制、物联网设备等多种应用场景。

weixin_42525632的博客 234

三菱FX3U PLC红绿灯ST编程实战:从基础逻辑到急停功能完整实现

本文以十字路口红绿灯控制为例,详细讲解了三菱FX3U PLC使用ST编程的完整实战过程。内容涵盖从基础时序逻辑、状态机设计,到急停功能、黄灯闪烁、昼夜模式切换等高级功能的实现,并提供了代码优化与调试技巧,帮助工程师掌握结构化文本在工业控制中的清晰、结构化应用。

weixin_29070861的博客 533

Linux内存管理--物理内存与虚拟内存

Linux内存管理--物理内存与虚拟内存

yaoming168的专栏 1027

在移动固态上安装ubuntu系统,重启后卡住报错:blk_update_request: I/O error, dev sda, sector ... op 0x0 (READ)如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1799

linux保留内存的作用,linux 虚拟内存的作用?

虚拟内存可以用来管理物理内存,进程直接和虚拟内存进行打交道而不是物理内存,为什么这样设计?什么是虚拟内存?虚拟内存 = 物理内存 + 磁盘使用页置换技术,地址转换技术,使得进程认为它拥有连续的可用内存,而实际上,它会被分割为多个物理内存碎片。1. 虚拟内存的作用利用磁盘起到的缓存的作用,提高进程访问磁盘的速度。虚拟内存可以为进程提供独立的内存空间,并通过动态链接库共享内存。虚拟内存可以控制进程对物...

weixin_39827905的博客 372

SKILL 是什么?怎么做?五分钟 带你从入门到精通

skill-creator 是 Anthropic 官方开源的“元技能”——一个专门用来创建 Skill 的 Skill。你只需要用自然语言描述想要什么功能,它会自动生成。从更宏观的视角看,Skills 的出现标志着 AI 编程的一次范式转变。在传统的 AI 编程中,代码是确定性的:1 是 1,2 是 2。但到了大模型时代,代码变得不确定——你不知道模型会输出什么,不知道它会不会突然删掉几行代码。这种不确定性让很多开发者感到不安。Skills 把这套逻辑又拉了回来。

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 642

MediaPipe 教程:从安装到应用-全网最全

MediaPipe是Google推出的开源框架,专为构建机器学习管道设计,可以高效处理视频、音频等时间序列数据。本文教程从安装到应用逐步讲解: 安装步骤简单,只需通过pip安装mediapipe包并验证版本; 重点演示人体姿态检测功能,可识别33个身体关键点; 提供基础代码实现,包括视频捕获、关键点检测与可视化; 强调模块化开发,将功能封装成类以提高代码复用性。 教程适合初学者,通过清晰指引和实用代码示例,帮助快速实现计算机视觉应用。

FJN110的博客 1563

Linux内存布局解析:虚拟内存和物理内存

本文深入解析Linux进程内存管理机制,从虚拟内存原理到实际内存布局。主要内容包括: 虚拟内存机制:每个进程拥有独立的4GB虚拟地址空间,通过MMU和页表实现虚拟到物理地址的转换。首次访问时触发缺页中断才真正分配物理内存。 内存布局结构:进程内存分为代码段、数据段、堆区(动态扩张)、栈区(函数调用)和共享内存区。堆通过brk/mmap系统调用扩张,栈随函数调用增长。 内存管理实践:malloc等函数先分配虚拟地址,实际访问时才分配物理页。介绍了VSZ、RSS等内存指标的含义,以及内存泄漏检测工具valgri

weixin_40543589的博客 1073

ofd转pdf报错:org.ofdrw.reader.ZipUtil.unZipFileByApacheCommonCompress【已解决】

ofd转pdf报错:java.lang.NoClassDefFoundError:org/apache/commons/io/function/IOIterator at org.ofdrw.reader.ZipUtil.unZipFileByApacheCommonCompress,java.lang.NoSuchMethodError:org.apache.commons.compress.archivers.zip.ZipArchiveInputStream.getNextEntry()

黄团团的个人博客 1283

linux程序设计:linux物理内存和虚拟内存

一. 物理内存和虚拟内存     我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念。     物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在Linux下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,

better me的博客 2817

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

程序员内功修炼系列:10 张图解谈 Linux 物理内存和虚拟内存

来源 |后端技术学堂责编 | Carol封图 | 优快云 付费下载于视觉中国我们都知道,程序可没这么好骗,任你内存管理把虚拟地址空间玩出花来,到最后还是要给程序实实在在的物理内存,不...

优快云云计算 3922

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Linux内存管理(下篇):10张图解再谈物理内存和虚拟内存

点击上方蓝色“后端技术学堂”关注后加个“星标”最新分享第一时间看!今天继续来学习Linux内存管理,什么?你更想学时间管理,我不配,抱个西瓜去微博学吧。img言归正传,上一篇文章 别再说...

Jerish的博客 1502

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Linux基础:1、物理内存 和 虚拟内存

物理内存 vs 虚拟内存 参考

crz_blog 198

分段显示 linux_Linux内存管理(下篇):10张图解再谈物理内存和虚拟内存

点击上方蓝色“后端技术学堂”关注后加个“星标”最新分享第一时间看!今天继续来学习Linux内存管理,什么?你更想学时间管理,我不配,抱个西瓜去微博学吧。img言归正传,上一篇文章 别再说你不懂Linux内存管理了,10张图给你安排的明明白白! 分析了 Linux 内存管理机制,如果已经忘了的同学还可以回头看下,并且也强烈建议先阅读那一篇再来看这一篇。限于篇幅,上一篇没有深入学习物理内存管...

weixin_29097457的博客 124

分段显示 linux_程序员内功修炼系列:10 张图解谈 Linux 物理内存和虚拟内存

来源 | 后端技术学堂责编 | Carol封图 | 优快云 付费下载于视觉中国我们都知道,程序可没这么好骗,任你内存管理把虚拟地址空间玩出花来,到最后还是要给程序实实在在的物理内存,不然程序就要罢工了。所以物理内存这么重要的资源一定要好好管理起来使用(物理内存,就是你实实在在的内存条),那么内核是如何管理物理内存的呢?物理内存管理在Linux系统中通过分段和分页机制,把物理内存划分 4K 大小的...

weixin_35981628的博客 95

linux 内存管理_Linux内存管理(下篇):10张图解再谈物理内存和虚拟内存

点击上方蓝色“后端技术学堂”关注后加个“星标”最新分享第一时间看!今天继续来学习Linux内存管理,什么?你更想学时间管理,我不配,抱个西瓜去微博学吧。img言归正传,上一篇文章 别再说你不懂Linux内存管理了,10张图给你安排的明明白白! 分析了 Linux 内存管理机制,如果已经忘了的同学还可以回头看下,并且也强烈建议先阅读那一篇再来看这一篇。限于篇幅,上一篇没有深入学习物理内存管...

weixin_39920338的博客 86

linux虚拟内存优点,虚拟内存是什么?有什么用?

大家好,我是良许。熟悉计算机的小伙伴都知道,我们常说的主机三大件分别是主板,CPU,内存,可见内存在计算机主机中的角色也非同一般,喜欢 DIY 主机的小伙伴对这三大件的了解更是精益求精。编写过程序的小伙伴对于程序的执行过程,也是耳熟能详了,先从硬盘加载到内存,然后 CPU 与内存进行数据交换与处理,完成相应的操作(真实执行细节相当复杂),从而实现相应的功能。但是内存的容量非常有限,由于内存的造...

weixin_42308943的博客 861

关于虚拟内存

虚拟内存(之所以称之为虚拟内存,是和系统中的逻辑内存和物理内存相对而言的。逻辑内存是站在进程角度看到的内存,因此是程序员关心的内容。而物理内存是站在处理器角度看到的内存,由操作系统负责管理。虚拟内存可以说是映射到这两种不同视角内存的一个技术手段。)技术就是一种由操作系统接管的按需动态内存分配的方法,它允许程序不知不觉中使用大于实际物理空间大小的存储空间(其实是将程序需要的存储空间以页...

weixin_42356065的博客 378

linux ps vsz malloc,认真分析下进程的内存,说说VSZ、RSS、PSS

进程占用的内存可以有以下这些类型:自身的代码共享库的代码运行过程分配的堆和栈通过mmap映射的磁盘文件内容1. 虚拟内存与物理内存这里要区分两个概念,虚拟内存和物理内存。物理内存对于进程来说是透明的,进程直接操作的是虚拟内存。而数据和代码是存放在真实的物理内存的,之所以进程在虚拟内存中寻址可以获取数据,是由于虚拟内存与物理内存存在着映射关系。当我们的进程向系统申请内存时,比方通过malloc方法,...

weixin_34543731的博客 972

Linux 内存文件系统

Linux内存文件系统:可满足高IO的要求 ramdisk: 基于虚拟在内存中的其他文件系统(ex2fs)。 挂载方式:mount /dev/ram /mnt/ramdisk ramfs: 物理内存文件系统,只存在于物理内存中。其大小也不是固定的,而是随着所需要的空间动态得增减。 挂载方式:mount -t ramfs none /mnt/ramfs -o maxsiz...

weixin_30343157的博客 116

Linux 内存共享

Linux 内存共享,/dev/shm文件系统,匿名 mmap 共享内存,写时复制(COW)

tangzhangyin的专栏 1200
上一篇: Linux中unmask的使用原理,永久生效
下一篇: Spark从hbase 并发取数据,并用spark-shell提交
Code_LT
博客等级 码龄10年 307粉丝 182原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值