CentOS 伺服器。當總使用的 RAM 不等於 RES 的總和時,這意味著什麼?
我在執行 CentOS 的虛擬託管伺服器上遇到問題。在過去的一個月裡,一個執行良好的程序(基於 java 的)在 JVM 啟動時開始出現獲取記憶體的問題。
我注意到的一件奇怪的事情是,當我啟動程序時,PID 說它正在使用 470mb 的 RAM,而“已用”記憶體立即下降了 1GB 以上。如果我執行“top”,則所有程序中使用的總 RES 與頂部列出的“used”相差近 700mb。
支持人員說這意味著我的程序存在記憶體洩漏。我不知道該相信什麼,因為我希望記憶體洩漏只會浪費程序分配的記憶體 - 而不是消耗沒有使用“頂部”顯示的額外記憶體。
我是開發人員而不是伺服器人員,所以我呼籲專家。對我來說,如果總 RES 記憶體加起來不等於總“已用”,則表明我的虛擬伺服器設置有問題。在這種情況下,我應該懷疑一個記憶體洩漏的 java 程序嗎?
如果我
free
以前使用:total used free shared buffers cached Mem: 2097152 149264 1947888 0 0 0 -/+ buffers/cache: 149264 1947888 Swap: 0 0 0
free
後:total used free shared buffers cached Mem: 2097152 1094116 1003036 0 0 0 -/+ buffers/cache: 1094116 1003036 Swap: 0 0 0
因此,看起來該程序正在使用(或導致使用)近 1GB 的 RAM。由於程序(基於
top
僅使用 470mb,這是否意味著核心突然使用了額外的 500mb?編輯:添加
cat proc/meminfo
- 執行 java 應用程序的輸出:MemTotal: 2097152 kB MemFree: 1112672 kB Buffers: 0 kB Cached: 0 kB SwapCached: 0 kB Active: 0 kB Inactive: 0 kB HighTotal: 0 kB HighFree: 0 kB LowTotal: 2097152 kB LowFree: 1112672 kB SwapTotal: 0 kB SwapFree: 0 kB Dirty: 0 kB Writeback: 0 kB AnonPages: 0 kB Mapped: 0 kB Slab: 0 kB PageTables: 0 kB NFS_Unstable: 0 kB Bounce: 0 kB CommitLimit: 0 kB Committed_AS: 0 kB VmallocTotal: 0 kB VmallocUsed: 0 kB VmallocChunk: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 Hugepagesize: 2048 kB
中的“已使用”欄位
top
反映了正在使用的 RAM 總量,包括程序、文件緩衝區和記憶體所使用的 RAM 總量。但 RES 數字僅顯示程序正在使用的 RAM 量,不包括文件緩衝區。要真正查看在沒有緩衝區的情況下使用了多少 RAM,請使用該
free
命令並查看該-/+ buffers/cache
行。“已使用”列中的數字顯示了程序實際使用了多少 RAM。這是一個例子:
$ free total used free shared buffers cached Mem: 2057196 1812352 244844 0 344768 833660 -/+ buffers/cache: 633924 1423272 Swap: 2097148 0 2097148
此輸出顯示系統有 2GB 的 RAM,其中 1.8GB 正在使用中。但是,其中 344MB 用於緩衝區,833MB 用於記憶體。減去它,程序和核心只使用了 633MB。
在啟動 Java 應用程序之前和之後執行該
free
命令,以更好地了解正在發生的事情。編輯:刪除了對核心記憶體的引用,這些工具未報告。