swap 原理
swap 就是內存交換的意思。
計算機對內存分為物理內存與虛擬內存。物理內存就是計算機的實際內存大小,虛擬內存則是從磁盤空間開辟出一部分內存空間虛擬出來的,所以也叫磁盤緩存。虛擬內存的出現,讓機器內存不夠的情況得到部分解決。程序運行的時候系統會在虛擬內存與物理內存直接進行替換和加載。這里的虛擬內存就是 swap。
進程運行的時候系統會判斷當前物理內存是否還有空閑,如果有那么則直接調入內存進行運行;如果沒有,那么會根據優先級選擇一個進程掛起,把該進程交換到 swap 中等待,然后把新的進程調入到內存中運行。
進程向系統請求內存發現不足時,系統會把內存中暫時不用的數據交換出去,放在 swap 分區里,這個過程稱為 swap out(so)
當進程又需要這些數據且系統發現還有空閑物理內存時,又會把 SWAP 分區中的數據交換到物理內存中,這個過程稱為 swap in(si)
swap 使用完,操作系統會觸發OOM-Killer機制,殺掉占用內存最大的進程。所以大家經常會發現內存飆高之后進程莫名其妙的不見了。。。。
jvm 與 swap 的關系
1:系統內存足夠 (jvm 內存未使用到 swap 內存),但 jvm 內存不夠,最終導致 jvm 的頻繁垃圾回收(FGC),由於 fullgc 時間很久,會導致線程的長期暫停
2:系統內存不夠,JVM 堆內存部分用到了 swap,此時的垃圾回收需要把 swap 的內存交換到系統物理內存再進行 jvm 的垃圾回收。導致每次 GC 的時間都變得很久
3:物理內存不夠用,大量 JVM 的堆內存被交換到 swap 之后,垃圾回收時把 swap 內存交換到物理內存,但 swap 的內存又不會立即交換回來。此時 swap 使用的內存占用會變大,可能會導致 oom killer
來源:https://testerhome.com/articles/21498