细心的朋友会注意
到,
当你在Linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching.这个问题,貌似有不少人在
问,不过都没有看到有什么很好解决的办法.那么我来谈谈这个问题.
先来说说free命令
[root@server ~]# free -m
total used free shared buffers cached<!-- IWMS_AD_BEGIN-->
<script src="http://www.linuxidc.com/system/system60.js" type="text/javascript"></script>
|
<!-- IWMS_AD_END-->
Mem:
249 163 86 0 10 94
-/+ buffers/cache: 58 191
Swap: 511 0 511
其中
:
total 内存总数
used 已经使用
的
内存数
free 空闲的内存数
shared 多个进程共享的内存总额
buffers Buffer Cache和cached Page Cache 磁盘缓存的大小
-buffers/cache 的内存数:used - buffers - cached
+buffers/cache 的内存数:free + buffers + cached
可用的memory=free memory+buffers+cached
有了这个基础后,可以得知,我现在used为163MB,free为86,buffer和cached分别为10,94
那么我们来看看,如果我执行复制文件,内存会发生什么变化.
[root@server ~]# cp -r /etc ~/test/
[root@server ~]# free -m
total
used free shared buffers cached
Mem: 249 244 4 0 8 174
-/+
buffers/cache: 62 187
Swap: 511 0 511
在命令执行结束后,used为244MB,free为4MB,buffers为8MB,cached为174MB,天呐都被cached吃掉了.
别紧张,这是为了提高
文
件读取效率的做法.
引用http://www.wujianrong.com/archives/2007/09/linux_free.html
"
为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换),
还采取了两种主要Cache方式:Buffer Cache和Page
Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了
I/O系统调用(比如read,write,getdents)的时间。"
那么有人说过段时间,linux会自动释放掉所用的内存,我们使用free再来试试,看看是否有释放>?
[root@server test]# free -m
total used free shared buffers cached
Mem:
249 244 5 0 8 174
-/+ buffers/cache: 61 188
Swap: 511 0 511
MS没有任何变化,那么我能否手动释放掉这些内存呢???回答是可以的!
/proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段.也就是说可以通过修改/proc中的文
件,来对当前kernel的行为做出调整.那么我们可以通过调整/proc/sys/vm/drop_caches来释放内存.操作如下
:
[root@server test]# cat /proc/sys/vm/drop_caches
0
首先,/proc/sys
/vm/drop_caches的值,默认为0
[root@server test]# sync
手动执行sync命令(描述:sync 命令运行 sync 子例程。如果必须停止系统,则运行 sync 命令以确保文件系统的完整性。sync
命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件)
[root@server test]# echo 3 > /proc/sys/vm/drop_caches
[root@server
test]# cat /proc/sys/vm/drop_caches
3
将/proc/sys/vm/drop_caches值设为3
[root@server test]# free -m
total used free shared buffers cached
Mem:
249 66 182 0 0 11
-/+ buffers/cache: 55 194
Swap: 511 0 511
再来运行free命令,发现现在的used为66MB,free为182MB,buffers为0MB,cached为11MB.那么有效的释放了
buffer和cache.
有关/proc/sys/vm/drop_caches的用法
在下面进行了说明
/proc/sys/vm/drop_caches (since Linux 2.6.16)
Writing to this file
causes the kernel to drop clean caches,
dentries and inodes from
memory, causing that memory to become
free.
To free pagecache, use echo 1 > /proc/sys/vm/drop_caches; to
free
dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;
to
free pagecache, dentries and inodes, use echo 3 >
/proc/sys/vm/drop_caches.
Because this is a non-destructive operation and dirty objects
are
not freeable, the user should run sync(8) first.
相关推荐
在Linux系统中,内存池是一种优化内存管理的技术,尤其对于频繁分配和释放小块内存的情况,内存池可以显著提升性能并减少系统开销。本文将深入探讨Linux下的内存池实现,包括其原理、优势以及如何在C或C++中进行实践...
在Linux中,交换空间(Swap Space)是指硬盘上的一个区域,它用于存储内存中的数据,以便释放出内存空间供其他进程使用。当系统需要更多的内存时,系统会将暂时不用的内存块的内容写到交换空间中,以便释放出内存...
在使用共享内存的程序异常退出时,由于没有释放掉共享内存,在调试时会出现错误。您可以使用shell命令来查看与释放已经分配的共享内存,下面将详细说明如何进行查看和释放分配的共享内存的方法。
### 手工释放Linux内存详解 #### 一、引言 在Linux环境下,内存管理是一项重要的任务,尤其在服务器环境中更是如此。随着程序的运行,Linux操作系统会利用空闲内存作为缓存,以提高文件读取效率。然而,这也可能...
Linux提供malloc和free函数供程序员分配和释放内存,实际上这些操作是由内存管理子系统处理的。内存分配可能涉及到匿名页(无文件映射的内存)和文件映射页(与磁盘文件关联的内存)。对于匿名页,Linux可能会使用...
Linux 内核中的内存管理方式是非常复杂和细腻的,它需要深入了解 Linux 内核的实现原理和数据结构,以便更好地理解和应用 Linux 内核中的内存管理方式。 知识点: 1. Linux 内核中的内存管理方式 2. 伙伴系统算法...
1. **记录内存操作**:mtrace会在malloc和free函数中插入额外的代码,用于记录每次分配和释放内存的操作细节。 2. **分析日志文件**:运行程序后,mtrace会生成一个日志文件,记录了所有内存分配和释放的信息。通过...
Linux内存管理是操作系统的核心组成部分,它负责...实验总结表明,通过实践操作,学生对Linux内存管理有了更深入的理解,并且能够应用于实际问题中,这对于未来深入学习操作系统和其他系统级编程有着积极的推动作用。
动态存储器管理还涉及到页框的分配和释放,Linux 中提供了多种接口来分配和释放页框,例如 alloc_pages、alloc_page、__get_free_pages、__get_free_page 等。 Linux 内存管理还涉及到缓存机制,缓存机制可以提高...
易语言Linux内存操作源码是针对Linux操作系统设计的编程代码,主要目的是为了在Linux环境下进行内存管理与操作。易语言是一种中国本土开发的、面向普通用户的编程语言,它以其简单的语法和直观的编程界面,降低了...
Linux操作系统的内存管理机制还包括延迟分配和请页机制释放内存时,先释放线性区对应的物理内存,然后释放线性区。这就叫做延迟分配和请页机制,充分利用了程序的局部性,节约内存空间,提高系统吞吐。 Linux操作...
在Linux内核中,内存管理涉及到多个层面,包括分配、释放、碎片控制以及高速缓存优化等。 首先,Linux对外提供的内存管理接口是通过一系列系统调用来实现的,如`sys_brk`用于扩展进程的堆空间,`kmalloc`用于分配...
在Linux中,创建共享内存的主要步骤包括: 1. 使用`shmget()`函数创建或获取共享内存段。 2. 使用`shmat()`函数将共享内存段映射到进程地址空间。 3. 使用`shmdt()`函数解除共享内存段的映射。 4. 使用`shmctl()`...
本文将详细讲解Linux下内存释放问题,包括如何解决虚拟内存不足的情况以及如何管理和调整swap分区。 1. **虚拟内存(Swap)的基本概念**: 虚拟内存是Linux中的一种策略,当物理内存不足以满足程序需求时,将部分...
### Linux下手动释放内存 在Linux系统中,内存管理是一个重要的方面,特别是在服务器环境中,合理的内存管理能够提高系统的性能和稳定性。本文将详细介绍如何通过命令手动释放Linux系统的内存,并解释这些命令背后...
交换机制是当物理内存不足时,Linux会将不活跃的页写入磁盘的交换分区,释放物理内存供其他进程使用。这一过程称为页面交换。当需要时,这些页面会被重新加载回内存,即页面回换。交换空间的设置和管理对系统性能有...
此外,传统数组的生命周期和作用域也受到限制,这使得程序员无法控制数组的内存释放和跨函数使用等问题。 动态内存分配可以解决以下四个传统数组的缺陷: 1. 数组长度必须事先指定且为常量。动态内存分配允许...
Linux的内存管理是内核中最复杂的部分之一,它涉及到了内存初始化、地址映射、请页、交换、分配与回收等多个方面。通过对这些核心功能及其内部机制的研究,可以更深入地理解Linux是如何高效地管理和利用有限的物理...
Linux内核内存管理是操作系统设计中的关键部分,它负责有效地分配和管理系统的物理和虚拟内存。在Linux系统中,内存管理的复杂性在于它需要在多个进程之间共享有限的资源,同时确保系统的稳定性和高效性。以下是...