Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 408|回复: 0

开发交流:Linux内存管理浅谈

[复制链接]

该用户从未签到

发表于 2011-10-24 10:19:32 | 显示全部楼层 |阅读模式
Linux内存管理浅谈

1.        导论
    linux内存管理还是比较复杂的,其中牵扯到很多方面的知识,这篇小博文算是自己对于内存管理的一点点的总结。


2.        虚拟内存
linux操作系统采用虚拟内存,每一个进程启动都有有自己的内存空间,这个空间跟操作系统的位数有关,如32位系统的虚拟内存空间为4G,而64位系统的虚拟内存空间为特别大。


采用虚拟内存的方式的好处多多,每个进程都在自己的内存空间中折腾,进程之间可以避免产生冲突;每个进程可以使用的内存空间突破了物理内存的限制;只要进程真正需要物理内存的时候,系统才会分配内存,这样可以最大程度的节省物理内存,系统还需要负责虚拟地址到实际物理地址的映射。通过虚拟内存这个中间层,使得进程和物理内存之间的组织变得更加自由。



3.        swap区
虚拟地址空间可以扩展进程可操控的内存范围,但实际的物理内存还是有限的,还可能会出现物理内存不足的情况。操作系统可以将物理内存中一部分不常访问的数据迁移到硬盘交互区中,这个硬盘交换区就成为swap区。通过冷数据迁出内存的方式,可以更有效的利用物理内存,等到程序真正需要这些数据时,再从swap区中将数据恢复到内存中。
数据频繁的在内存和swap区之间进行交互会导致程序性能骤降,所以在高性能服务中要避免swap情况的发生。



4.        free
在linux中的shell中执行free命令,free命令的作用是显示系统中已使用和空闲的内存情况,以下是在我的开发机上free命令的执行情况:




以下会针对着free展示的几个指标展开一下:
1)        used指标表明当前已被使用的内存
2)        free指标表示未被分配的内存
3)        shared指标表示当前系统的共享内存占用情况
4)        buffer指标表示系统分配但可被使用的buffer数量
5)        cached指标表明系统分配但可被使用的cached数量


先解释一下buffer和cache的区别,两者都会缓存系统的某些数据,其中buffer缓存的是块设备的数据,如文件系统的metadata一级tracking in-flight pages。举个简单的例子,在shell下调用ls /home,然后再调用free就会发现buffer指标的数字增加了。cached则会缓冲我们打开的普通的文件信息,再举个简单的例子,在shell下调用vi XX,然后再free也会发现cached指标的数字也增加了。


linux系统会将暂时不使用的内存作为文件和数据的缓冲,以提高系统的性能,当系统需要这些内存时,系统会自动释放以供使用,系统真正占用的内存可以是:used-buffers-cached。
再补充一点,Linux为了提高磁盘与内存的存取效率,采用了两种主要的Cache方式:buffer cache和page cache。前者针对着磁盘块的读写,后者针对着文件inide的读写,这些cache有效的缩短了I/O系统调用的时间。



5.        top
在linux的shell中调用top命令,就可看各个进程更加详细的内存使用。




其中,virt表示虚拟内存占用,res表示常驻内存,也就是实际的物理内存占用,shr表示共享内存占用。其中res指标会有一点小出入:一是可能有些东西被交换到swap上,另一个就是有些内存可能是共享的。



6.        mmap/malloc
这里的mmap只谈文件映射,mmap可以将磁盘上的某个文件映射到进程的虚拟地址空间上,映射完毕后,进程可以直接操作地址指针的方式,而无需再使用rear/write的方式。当进程访问mmap后的地址时,磁盘中的内容并没有存在于内存中,这时候会触发一次中断将磁盘内存读取内存中。


malloc则表示当前进程想要在堆上申请一块内存,系统会在进程的虚拟地址空间中的堆区分配一块区域,然后该调用就会返回该区域的地址。malloc调用并不会触发实际的物理内存分配,因为linux系统采用的是延迟分配的方式分配内存,只有操作malloc分配的内存区域时才会触发系统中断,然后才会真正分配内存。


mmap的中断是一种大中断,因为涉及磁盘与内存之间的交互,势必会影响程序的性能;malloc的中断是一种小中断,由于在内存中操作,速度非常快,几乎不会影响系统的性能。


在程序开发时,要注意mmap后系统性能暂时下降的问题,可以采用预读或是数据预热的方式。
回复

使用道具 举报

该用户从未签到

发表于 2011-10-24 10:19:34 | 显示全部楼层

Re:开发交

对于这方面只是还是有必要了解一下的!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-11 02:25 , Processed in 0.376310 second(s), 45 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表