linux記憶體管理模組引數的個人理解
先上乙個引數圖
total:總共有多少記憶體
used:用了多少記憶體(這裡的記憶體不僅包括真正在用的,還包括給應用程式預留的,這部分空間有一部分其實等於沒用,因為它是預留的,別的程式記憶體不夠它照樣得把這部分分給人家t.t,但很新手一看used就瞬間緊張了。。。)
free:系統沒有用的,也可以理解為是這部分扔在那既沒有預留給哪個程式,也沒有被系統使用的部分。。。
shared:程式用來共享的部分,但其實它也是預留的,並沒有使用。。。
buffers:快取的記憶體,也可以理解為預留的,並沒有使用。。。
cached:快取的記憶體,也可以理解為預留的,還是沒有使用。。。
那麼第一行就可以理解了
total = used + free
伺服器的可用記憶體 = used - shared - buffers - cached + free
是不是看的一頭霧水哈哈哈哈哈哈哈哈哈
正常,我看別人教程也是這感覺,那麼換個說法
8001(total) ≈ used(6412) + free(1588)
伺服器的可用記憶體 = used(6412) - shared(66) - buffers(269) - cache(3826) + free(1588) ≈ +buffers/cache (5684)
伺服器的已用記憶體 = used(6412) - shared(66) - buffers(269) - cache(3826) ≈ -buffers/cache (2251)
這裡就出現了第二行的引數
-buffers/cache && +buffers/cache
我們可以看出+buffers/cache ≈ 伺服器的可用記憶體
-buffers/cache ≈ 伺服器的已用記憶體
我們就可以近似的理解為第二行是linux伺服器幫助我們計算的真實已用記憶體(-buffers/cache)和真實可用記憶體(+buffers/cache)
至於為什麼會有差異,因為記憶體管理不僅涉及這幾個模組,還涉及到很多的記憶體管理,只不過沒有過多展示,想深入的可以做些研究
swap
sawp空間很好理解,類似於windows的虛擬記憶體,當記憶體不夠時系統會自動開始與磁碟進行檔案io互動,但由於記憶體和磁碟寫入的巨大差異自然而然就會出現伺服器的延遲高現象,而且由於系統頻繁的釋放快取記憶體也會導致伺服器負載增高進而導致一系列問題,所以當我們看到sawp空間的數值開始頻繁變動的時候,那就真的要加記憶體條了~
ps:阿里雲預設不建立交換空間,這樣做既可以降低磁碟損耗,也可以保證伺服器更快響應,當然最重要的是多賺錢~~~
跨模組記憶體管理的陷阱
許式偉2004年6月21日 由於編譯器 編譯模式的不同,不同模組的記憶體結構與管理程式往往並不相同。因此,如果我們在乙個模組申請記憶體,而在另乙個模組中釋放,這是乙個不安全的做法。因為模組在釋放記憶體的時候,並不會預料到需要釋放的記憶體並非是自己管理的。直觀的說,假設我們有兩個模組 module1,...
乙個動態記憶體管理模組的實現
摘要 介紹乙個動態記憶體管理模組,可以有效地檢測c程式中記憶體洩漏和寫記憶體越界等錯誤,適用於具有標準c語言 當前,絕大多數嵌入式 平台上的軟體都採用c語言編寫。除了 簡潔 執行高效之外,靈活操作記憶體的能力更是c語言的重要特色。然而,不恰當的記憶體操作通常 也是錯誤的根源之一。如 記憶體洩漏 不能...
linux的記憶體管理
linux的記憶體管理 linux的記憶體分為 物理記憶體和虛擬記憶體。物理記憶體就是系統硬體提供的記憶體大小,是真正的記憶體。虛擬記憶體 虛擬記憶體就是為了滿足物理記憶體的不足而提出的策略,它是利用磁碟空間虛擬出的一塊邏輯記憶體,用作虛擬記憶體的磁碟空間被稱為交換空間 swap space 使用場...