[JVM]关于swap的理解

发布时间 2023-10-09 18:42:33作者: knqiufan

关于swap的理解

概念

swap就是内存交换的意思。

计算机内存分为物理内存和虚拟内存。物理内存就是计算机实际内存的大小;虚拟内存是磁盘空间里开辟出一部分,是虚拟出来的内存空间,所以也叫磁盘缓存。

虚拟内存使得计算机在内存不够的情况可以得到部分解决。

程序运行的时候会在虚拟内存与物理内存之间进行替换和加载。这里的虚拟内存就是swap

进程在运行的时候系统会判断当前的物理内存是否还有空闲,如果有则直接调用内存运行;如果没有则会根据优先级选择一个进程挂起,把该进程交换到swap中等待,然后把新的进程调入到内存中运行。

进程向系统请求内存发现不足时,系统会把内存中暂时不用的数据交换出去,放在swap分区里,这个过程是swap out(so);当进程又需要这些数据且系统发现还有空闲的物理内存,又会把swap分区中的数据交换到物理内存,这个过程是swap in(si)

swap使用完,操作系统会触发OOM-Killer机制,杀掉占用内存最大的进程。所以大家经常会发现内存飚高之后,进程莫名其妙就不见了。

JVM和swap的关系

  • 系统内存足够,JVM内存未使用到``swap内存,但是JVM内存不够了,最终会导致频繁的Full GCFull GC的时间相对比较久,会导致线程的长期暂停。
  • 系统内存不够,JVM内存占用到了部分的swap,此时GC需要把swap区的内存交换到系统物理内存中再进行JVM的垃圾回收工作,这会导致每次的GC时间变久。
  • 系统内存不够,大量的JVM堆内存被交换到swap,垃圾回收时把swap内存交换到物理内存,但是swap内存又不会立即交换回来,此时swap使用的内存占用会变大,就可能导致 OOM-Killer