我的应用程序在 Linux 中运行了多个 JVM,交换使用率大多为零。但是,有时由于流量大或数据库速度慢,JVM 会消耗交换内存,这是不建议的。如果发生这种情况,我的计划是通过“关闭/打开交换”来回收交换,而无需在夜间窗口关闭应用程序。
当我在操作系统上关闭交换时,消耗交换内存的进程会发生什么?它们会丢失分配的内存块吗?还是操作系统会将交换内存块移回物理内存?我问这个问题的前提是物理内存有足够的可用空间来容纳所有交换使用。
我寻找回收交换的原因是由于交换使用行为;当交换使用率为零时,进程不会消耗交换,但当交换使用率非零时,即使有足够的物理内存可用,它们也会开始越来越多地消耗交换。
我的问题是处理实际情况,当服务器遇到大量需求并使用交换内存时,并且在大量需求消失后永远不会再恢复。
答案1
我只信任 GNU/Linux 来管理内存。
当内存需求很高时,GNU/Linux 确实会将不活动的进程交换到交换内存中,以增加运行进程和文件缓存的可用物理内存 (RAM)。即使内存需求减少,如果不需要,该交换内存可能不会释放回 RAM。这样,对于实际需要它的进程和文件缓冲区来说,可用内存达到最大值。不活动的进程继续留在交换中。
当应用程序在生产中运行时,“交换”是否安全?
是的,即使没有足够的 RAM 来满足所有交换使用量。如果 RAM 足以满足当前需求,则关闭交换将成功。如果物理内存不足,则swapoff
不会成功并发出swapoff failed: Cannot allocate memory
错误。因此,由于系统设计,它仍然是安全的。
但是,再次强调:不建议这样做:它不会带来任何性能提升。相反,它会导致运行进程和文件缓存的可用 RAM 暂时减少,因为其中一部分实际上被浪费在重新分配那些不活跃使用/不需要的 RAM 上。