Skip to content

Latest commit

 

History

History
31 lines (17 loc) · 2.04 KB

virtual-memory.md

File metadata and controls

31 lines (17 loc) · 2.04 KB

linux虚拟内存

参考资料

理解 Linux 的虚拟内存

操作系统好像一个油嘴滑舌的青年男子,对好多个姑娘许下了“我整个人都是你的”的诺言。当姑娘要求兑现诺言的时候,操作系统才开始辗转腾挪,拼凑出一个还不算太差的现实交给进程。

分页与页表

CPU 中有一种硬件,内存管理单元 MMU(Memory Management Unit)专门用来将翻译虚拟内存地址。CPU 还为页表寻址设置了缓存策略,由于程序的局部性,其缓存命中率能达到 98%。

SWAP

虚拟内存通过缺页中断为进程分配物理内存,内存总是有限的,如果所有的物理内存都被占用了怎么办呢?

Linux 提出 SWAP 的概念,Linux 中可以使用 SWAP 分区,在分配物理内存,但可用内存不足时,将暂时不用的内存数据先放到磁盘上,让有需要的进程先使用,等进程再需要使用这些数据时,再将这些数据加载到内存中,通过这种”交换”技术,Linux 可以让进程使用更多的内存。

JVM 进程占用虚拟内存过多

使用 TOP 查看系统性能时,我们会发现在 VIRT 这一列,Java 进程会占用大量的虚拟内存。

导致这种问题的原因是 Java 使用 Glibc 的 Arena 内存池分配了大量的虚拟内存并没有使用。此外,Java 读取的文件也会被映射为虚拟内存,在虚拟机默认配置下 Java 每个线程栈会占用 1M 的虚拟内存。详细的参考资料为http://blog.jobbole.com/83878/

而真实占用的物理内存要看 RES (resident) 列,这一列的值才是真正被映射到物理内存的大小。

常用命令pmap

如果想单独查看某一进程的虚拟内存分布情况,可以使用 pmap pid 命令,它会把虚拟内存各段的占用情况从低地址到高地址都列出来。

java三连、系统三连

一次 Java 内存泄漏的排查