Linux 内存类型分为
VIRT
虚拟内存(Virtual Memory) : 逻辑意义上的内存空间概念,程序申请内存的大小,并非是真实物理内存RES
驻留内存(Resident Memory):真实占用物理内存的大小,包含SHR,但不包含SWAPSHR
共享内存(Share Memory): 进程间共享的物理内存。另外,进程独占物理内存 = RES - SHRSWAP
交换空间 : 是在磁盘中开辟的内存空间
单个进程使用内存简介
进程使用内存,需要先申请再使用,其中使用大小可以小于申请大小,如:进程A
申请 10 MB
的内存,但实际只使用了 5 MB
。
RES
驻留内存,其值是指物理内存,是程序在物理内存中驻留的大小,不包括SWAP
到交换空间
的内存,所以并不一定是程序真实占用的内存。举个例子,进程A
申请 10 MB
的内存,但实际只使用了 5 MB
,但是 RES
可能只有 4 MB
, 还有 1 MB
放到交换空间
里了。
VIRT
虚拟内存是一个逻辑意义上的内存概念。表示进程 “需要的” 虚拟内存大小,包括进程使用的库、代码、数据等。假如进程申请 10MB
的内存,但实际只使用了 5MB
,那么它会增长 10MB
,而不是实际的使用量
-
为什么是说逻辑上的呢? 为什么说是虚拟呢?
因为它不止包括真实的物理内存,还包括在磁盘中虚拟出来的内存空间,这片虚拟出来的内存并非常规意义上的物理内存,因此只是称之为逻辑意义上的内存,也就是虚拟内存。
-
那为什么要在磁盘中虚拟出一片内存来呢?
当然是为了解决物理内存不足而设计的,专门开辟出来的这片磁盘内存叫做
SWAP
(交换空间) -
所以进程的虚拟内存时,包括 3 部分
1. 占用的物理内存,也就是驻留内存-RES
2. 缓存在交换空间的外存
3. 申请的内存中,还未使用到的部分
SWAP
从上面的讲述中,我们知道了,SWAP 为交换空间,是专门在磁盘中开辟出的一片空间,为弥补物理内存不足而设计的。
-
进程在什么时机会使用交换空间?
在物理内存不够时,会使用交换空间,这与 系统配置
/proc/sys/vm/swappiness
有关,Ubuntu 默认配置都是 60, 表示当物理内存剩余 60% 时,使用交换空间- vm.swappiness = 0: 表示尽量不使用 SWAP,当物理内存用完时才会使用 SWAP
- vm.swappiness = 100: 表示尽量使用 SWAP
-
如何设置 vm.swappiness 为 0 ?
-
临时设置
echo 0 > /proc/sys/vm/swappiness 或 sysctl vm.swappiness=0
-
永久设置
- 配置
echo "vm.swappiness=0" >> /etc/sysctl.conf
- 生效
sysctl -p
-