关于swap的理解
概念
swap
就是内存交换的意思。
计算机内存分为物理内存和虚拟内存。物理内存就是计算机实际内存的大小;虚拟内存是磁盘空间里开辟出一部分,是虚拟出来的内存空间,所以也叫磁盘缓存。
虚拟内存使得计算机在内存不够的情况可以得到部分解决。
程序运行的时候会在虚拟内存与物理内存之间进行替换和加载。这里的虚拟内存就是swap
。
进程在运行的时候系统会判断当前的物理内存是否还有空闲,如果有则直接调用内存运行;如果没有则会根据优先级选择一个进程挂起,把该进程交换到swap
中等待,然后把新的进程调入到内存中运行。
进程向系统请求内存发现不足时,系统会把内存中暂时不用的数据交换出去,放在swap
分区里,这个过程是swap out(so)
;当进程又需要这些数据且系统发现还有空闲的物理内存,又会把swap
分区中的数据交换到物理内存,这个过程是swap in(si)
。
当swap
使用完,操作系统会触发OOM-Killer
机制,杀掉占用内存最大的进程。所以大家经常会发现内存飚高之后,进程莫名其妙就不见了。
JVM和swap的关系
- 系统内存足够,JVM
内存未使用到``swap
内存,但是JVM
内存不够了,最终会导致频繁的Full GC
,Full GC
的时间相对比较久,会导致线程的长期暂停。 - 系统内存不够,
JVM
内存占用到了部分的swap,此时GC
需要把swap
区的内存交换到系统物理内存中再进行JVM
的垃圾回收工作,这会导致每次的GC
时间变久。 - 系统内存不够,大量的
JVM
堆内存被交换到swap
,垃圾回收时把swap
内存交换到物理内存,但是swap
内存又不会立即交换回来,此时swap使用的内存占用会变大,就可能导致OOM-Killer
。