一个问题
51放假前的时候,一个以前的同事说他们的系统出现 物理空闲内存为 0, swap 分区使用增长,增长到 3G 左右就会引起应用异常退出。但是 JVM 监控看到堆还是有大量空闲空间的。昨天又看到他在朋友圈求助这个问题,决定研究下。
按以前的理解,物理内存不够时,就会把一些不常用的内存页交换到 swap 空间,以释放内存。他碰到物理内存耗尽、swap 空间增长,这是很正常的。只是这些增长的内存干嘛用了。
free -m
命令能只看到物理内存、交换空间各使用了多少,但看不到是每个进程具体用了多少。
还是得靠 top
命令,进入 top
命令的显示界面后,按下 Shift+m
就可以按内存使用排序,如下图:
假如排在第一的是个 Java 进程,占用了 6G 内存,而JVM配置的最大堆内存是 4G,说明非堆内存(本地内存、线程栈等)占用了 2G。
后面跟那个同事求证,是他们最近上线的一个组件用了 Netty,使用不当导致本地内存泄漏。
关于 swap 的一切
原文: https://www.linux.com/news/all-about-linux-swap-space
Linux 把物理内存(RAM)分为一块一块,称为 页(page)。
交换是把内存页拷贝到提前配置在硬盘上的空间(称为交换空间)的过程,以释放页的内存。
物理内存和交互空间的组合就是可用的虚拟内存。
交互有两个重大意义:
* 首先,系统需要的内存比物理内存更大时,内核交换出较少使用的页,给当前应用(进程)立即需要的内存。
* 其次,应用启动阶段需要大量页可能只用于初始化,然后就再也没有使用。系统可以交换这些页并释放内存用于给其他进程或磁盘缓存。
交换的负面作用:
* 硬盘比内存慢了数个数量级,内存是以微秒衡量的,硬盘是以毫秒衡量;
* 频繁的交换入、交换出将导致性能瓶颈。
Linux 有两种形式的交换空间:
* 交换分区:硬盘上独立的区域,其他文件不能存放。
* 交换文件:文件系统里的一个特定文件。
查看 swap 空间信息: swapon -s
Filename Type Size Used Priority
/dev/sda5 partition 1046524 54244 -1
如果有两个交换空间且优先级相同,Linux swapping 系统将交换使用这两个空间,这样可以提升性能。
交换空间应该多大?
如果有足够的内存,可以把交换空间禁用了。
对于桌面系统,交换空间大小可以是内存的两倍;
对于服务器,使用小的交换空间(比如是物理内存的一般),要监控交换空间的使用情况,如果需要,升级内存。
欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。