热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linux释放进程内存空间,你知道什么是Linux内存的分配和释放吗?

今天小编要跟大家分享的文章是关于Linux内存的分配和释放,熟悉Linux系统的小伙伴们可能对此并不,陌生,但是对于刚刚接触Linux小伙

今天小编要跟大家分享的文章是关于Linux内存的分配和释放,熟悉Linux系统的小伙伴们可能对此并不,陌生,但是对于刚刚接触Linux小伙伴们来说,还不是很理解,今天小编就特意为大家准备了这篇文章让我们一起来看一看Linux内存的分配和释放是什么。

c9b7e0f0e89fc8d095a1c44ddaf59361.png

一、了解内存分配机制(共享映射与请求分页)

通过 pmap 命令,可以获取用户进程逻辑地址空间中映射的内存信息:

pmap -x $pid

其中 -x 表示获取详细信息。

下面是一个例子:

pmap -x $(pidof emacs) |head -20

其中,“Address(地址)”指的进程的逻辑地址空间。

“Kbytes”列表示的是对应逻辑地址的容量,以Kb为单位

“RSS”列表示的是实际使用的物理内存容量,由于分页机制的存在,这个值一般要比”Kbytes”的值要少。

“Mapping”列为逻辑内存的映射方式,其中”[annon]“表示通过malloc函数来分配的堆空间(匿名内存),”[stack]“为进程的栈空间,这两种映射都是将物理内存映射到进程的逻辑内存上去。而”emacs-25.3″,”libpixbufloader-svg.so”等文件名则表示它们执行的是文件映射,他们对应的是磁盘上的文件。当这些文件被读入高速缓存后,相应的内存空间被映射成进程的逻辑内存。

当出现多个程序共同使用相同的文件映射(共享库)时,它们可以共享磁盘高速缓存中的同一空间,从而节省物理内存的使用量,这种技术就是”共享映射”技术。

除了共享库外,进程的fork也使用了共享映射技术。

当父进程fork子进程时,Linux内核并不对内存中的内容进行实际上的复制,而是将映射到父进程逻辑地址空间内的那部分内容原封不动地共享映射到子进程的逻辑地址空间内。但为了防止父进程和子进程的内存操作相互影响,Linux内核在进行共享映射时,相应的内存区域会暂时设置为写保护。当某一方进程试图操作内存时,会引发只读异常。内核检测到这个异常后,会复制操作的这个内存页,从而使两个进程都可进行独立写入。

这种在写入时复制的机制叫做“写时复制(copy-on-write)”

另一方面,进程将可执行文件或共享库文件内容读入内存并映射到进程逻辑地址空间上时,并不会读入全部的文件内容,而是先标记”该文件的内容已经被映射到逻辑地址空间内”.

当进程访问逻辑地址空间时,由于不存在对应的物理内存,会引发换页错误的异常。内容检测到该异常后会将所需部分以内存页为单位读入内存中。这种只读入所需内容的机制,叫做请求分页。

9c6821586e3033646c127734737a63a6.png

二、了解内存释放机制

当其他进程需要新的物理内存时,就涉及到如何将尚有数据残余的物理内存释放或换出来的问题了。

当需要新物理内存时,会优先释放Inactive(file)和Active(file)中记录的内存页,只需要将脏数据写入文件中再释放内存页即可。

而Inactive(anon)和Active(anon)内存页则需要将内容交换到物理磁盘上的swap中后再释放。

具体来说,Linux会在进程页表上做一个标记,标记出换出内存所对应的逻辑地址。当进程访问该逻辑地址时,会产生相应物理内存不存在的异常,Linux内核检测到这个异常后,会再次将数据从swap中加载入空闲内存,并重新配置页表信息。

Linux内核使用两种机制来加快换出处理速度:

· 一种是预读。

当某一个内存页需要换入时,Linux内核会将其后的几个内存页一起换入。因为进程连续访问多个内存页的可能性很大。预读的页数为内核参数

vm.page-cluster 决定为 2^vm.page-cluster.

· 另一种是交换缓存。

即在换入某个内存页后,物理磁盘上交换空间中仍然保留原数据,这种状态的内存会记录在“交换缓存”的列表上。这样当需要再次换出记录在“交换缓存”上的内存页的数据时,就无需再次换入了。

每个进程的内存使用情况可以通过查看 /proc/进程ID/status 来查看

cat /proc/$(pidof emacs)/status

Name: emacs

Umask: 0022

State: S (sleeping)

Tgid: 6769

Ngid: 0

Pid: 6769

PPid: 1

TracerPid: 0

Uid: 1000 1000 1000 1000

Gid: 1000 1000 1000 1000

FDSize: 64

Groups: 986 998 1000

NStgid: 6769

NSpid: 6769

NSpgid: 6769

NSsid: 6769

VmPeak: 567040 kB

VmSize: 567040 kB

VmLck: 0 kB

VmPin: 0 kB

VmHWM: 241176 kB

VmRSS: 241176 kB

RssAnon: 204544 kB

RssFile: 36604 kB

RssShmem: 28 kB

VmData: 231712 kB

VmStk: 1596 kB

VmExe: 2332 kB

VmLib: 47832 kB

VmPTE: 1008 kB

VmSwap: 0 kB

HugetlbPages: 0 kB

CoreDumping: 0

Threads: 4

SigQ: 1/15456

SigPnd: 0000000000000000

ShdPnd: 0000000000000000

SigBlk: 0000000000000000

SigIgn: 0000000004381000

SigCgt: 00000001db816eff

CapInh: 0000000000000000

CapPrm: 0000000000000000

CapEff: 0000000000000000

CapBnd: 0000003fffffffff

CapAmb: 0000000000000000

NoNewPrivs: 0

Seccomp: 0

Cpus_allowed: 3

Cpus_allowed_list: 0-1

Mems_allowed: 1

Mems_allowed_list: 0

voluntary_ctxt_switches: 12951

nonvoluntary_ctxt_switches: 21641

其中比较有用的项有:

VmData

data段的大小

VmExe

text段的大小

VmHWM

当前物理内存使用量的最大值

WmLck

用mlock锁定的内存大小

VmLib

共享库的使用量

VmPTE

页面表的大小

VmPeak

当前物理内存的最大值

VmRSS

物理内存的实际使用量

VmSize

逻辑地址的大小

VmStk

堆栈的大小

VmSwap

交换空间的使用量、

以上就是小编今天为大家分享的关于你知道什么是Linux内存的分配和释放吗?的文章,希望本篇文章能够对正在学习或者从事Linux相关工作的你有所帮助。想要了解更多Linux相关知识记得关注达内Linux培训官网。

来源:暗无天日,

lujun9972.github.io/blog/2018/04/18/linux内存的分配和释放/

*声明:内容与图片均来源于网络(部分内容有修改),版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。



推荐阅读
  • Node.js 教程第五讲:深入解析 EventEmitter(事件监听与发射机制)
    本文将深入探讨 Node.js 中的 EventEmitter 模块,详细介绍其在事件监听与发射机制中的应用。内容涵盖事件驱动的基本概念、如何在 Node.js 中注册和触发自定义事件,以及 EventEmitter 的核心 API 和使用方法。通过本教程,读者将能够全面理解并熟练运用 EventEmitter 进行高效的事件处理。 ... [详细]
  • 通过整合JavaFX与Swing,我们成功地将现有的Swing应用程序组件进行了现代化改造。此次升级不仅提升了用户界面的美观性和交互性,还确保了与原有Swing应用程序的无缝集成,为开发高质量的Java桌面应用提供了坚实的基础。 ... [详细]
  • 本文介绍了Android动画的基本概念及其主要类型。Android动画主要包括三种形式:视图动画(也称为补间动画或Tween动画),主要通过改变视图的属性来实现动态效果;帧动画,通过顺序播放一系列预定义的图像来模拟动画效果;以及属性动画,通过对对象的属性进行平滑过渡来创建更加复杂的动画效果。每种类型的动画都有其独特的应用场景和实现方式,开发者可以根据具体需求选择合适的动画类型。 ... [详细]
  • jQuery Flot 数据可视化插件:高效绘制图表的专业工具
    jQuery Flot 是一款高效的数据可视化插件,专为绘制各种图表而设计。该工具支持丰富的图表类型和自定义选项,适用于多种应用场景。用户可以通过其官方网站获取示例代码和下载资源,以便快速上手和使用。 ... [详细]
  • 为了优化直播应用底部聊天框的弹出机制,确保在不同设备上的布局稳定性和兼容性,特别是在配备虚拟按键的设备上,我们对用户交互流程进行了调整。首次打开应用时,需先点击首个输入框以准确获取键盘高度,避免直接点击第二个输入框导致的整体布局挤压问题。此优化通过调整 `activity_main.xml` 布局文件实现,确保了更好的用户体验和界面适配。 ... [详细]
  • 深入理解Spark框架:RDD核心概念与操作详解
    RDD是Spark框架的核心计算模型,全称为弹性分布式数据集(Resilient Distributed Dataset)。本文详细解析了RDD的基本概念、特性及其在Spark中的关键操作,包括创建、转换和行动操作等,帮助读者深入理解Spark的工作原理和优化策略。通过具体示例和代码片段,进一步阐述了如何高效利用RDD进行大数据处理。 ... [详细]
  • RancherOS 是由 Rancher Labs 开发的一款专为 Docker 设计的轻量级 Linux 发行版,提供了一个全面的 Docker 运行环境。其引导镜像仅 20MB,非常适合在资源受限的环境中部署。本文将详细介绍如何在 ESXi 虚拟化平台上安装和配置 RancherOS,帮助用户快速搭建高效、稳定的容器化应用环境。 ... [详细]
  • Typora快捷键使用指南:提升写作效率的必备技巧 ... [详细]
  • 精通jQuery:深入解析事件处理机制与应用技巧
    本文详细探讨了jQuery的事件处理机制及其应用技巧,通过具体的代码示例,逐一解析了每个jQuery代码片段与其对应的HTML结构。文章以标记为基准,CSS作为通用样式,确保每段代码都能独立运行。HTML和CSS代码统一放置在文章末尾,方便读者参考和实践。 ... [详细]
  • 本文深入探讨了RecyclerView的缓存与视图复用机制,详细解析了不同类型的缓存及其功能。首先,介绍了屏幕内ViewHolder的Scrap缓存,这是一种最轻量级的缓存方式,旨在提高滚动性能并减少不必要的视图创建。通过分析其设计原理,揭示了Scrap缓存为何能有效提升用户体验。此外,还讨论了其他类型的缓存机制,如RecycledViewPool和ViewCacheExtension,进一步优化了视图复用效率。 ... [详细]
  • 如何在Spark数据排序过程中有效避免内存溢出(OOM)问题
    本文深入探讨了在使用Spark进行数据排序时如何有效预防内存溢出(OOM)问题。通过具体的代码示例,详细阐述了优化策略和技术手段,为读者在实际工作中遇到类似问题提供了宝贵的参考和指导。 ... [详细]
  • 深入解析 Django 中用户模型的自定义方法与技巧 ... [详细]
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
  • 本文深入探讨了在Android应用开发中常见的相机连接故障问题,特别是在RK3288平台和Android 6.0系统上。通过分析具体案例,本文提供了详细的解决方案和应对策略,旨在帮助开发者有效解决相机连接问题,提升应用的稳定性和用户体验。 ... [详细]
  • 在安装 Greenplum 的过程中,正确配置 `gpinitsystem_config` 文件是至关重要的一步。本文详细介绍了如何优化该文件,以确保数据库集群的高效初始化和稳定运行。通过调整关键参数,用户可以更好地适应不同的硬件环境和业务需求,从而提升系统的整体性能。 ... [详细]
author-avatar
mobiledu2502923963
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有