文章插圖

文章插圖
什么是內存
內存(Memory)是計算機的重要部件之一,也稱內存儲器和主存儲器,它用于暫時存放CPU中的運算數據,與硬盤等外部存儲器交換的數據 。
它是外存與CPU進行溝通的橋梁,計算機中所有程序的運行都在內存中進行,內存性能的強弱影響計算機整體發揮的水平 。
只要計算機開始運行,操作系統就會把需要運算的數據從內存調到CPU中進行運算,當運算完成,CPU將結果傳送出來 。
內存的運行也決定計算機整體運行快慢的程度 。
Linux內存回收機制
為啥要回收:
內核需要為任何時刻突發到來的內存申請提供足夠的內存,以便cache的使用和其他相關內存的使用不至于讓系統的剩余內存長期處于很少的狀態 。當真的有大于空閑內存的申請到來的時候,會觸發強制內存回收 。
內存回收針對的目標有兩種,一種是針對zone的,另一種是針對一個memcg的,把針對zone的內存回收方式分為三種,分別是快速內存回收、直接內存回收、kswapd內存回收 。
查看Linux內存情況查看/proc/meminfo
bash
[[email protected] ~]# cat /proc/meminfoMemTotal:16166688 kBMemFree:14051412 kBMemAvailable:14772588 kBBuffers:2116 kBCached:1073260 kBSwapCached:0 kBActive:770384 kBInactive:698264 kBActive(anon):450156 kBInactive(anon):76748 kBActive(file):320228 kBInactive(file):621516 kBUnevictable:0 kBMlocked:0 kBSwapTotal:33554428 kBSwapFree:33554428 kBDirty:476 kBWriteback:0 kBAnonPages:393328 kBMapped:153828 kBShmem:133628 kBSlab:246448 kBSReclaimable:133892 kBSUnreclaim:112556 kBKernelStack:13472 kBPageTables:30496 kBNFS_Unstable:0 kBBounce:0 kBWritebackTmp:0 kBCommitLimit:41637772 kBCommitted_AS:4257776 kBVmallocTotal:34359738367 kBVmallocUsed:320696 kBVmallocChunk:34350426108 kBHardwareCorrupted:0 kBAnonHugePages:155648 kBCmaTotal:0 kBCmaFree:0 kBHugePages_Total:0HugePages_Free:0HugePages_Rsvd:0HugePages_Surp:0Hugepagesize:2048 kBDirectMap4k:279276 kBDirectMap2M:6965248 kBDirectMap1G:11534336 kB使用free命令查看bash
[[email protected] ~]# free -htotalusedfreesharedbuff/cacheavailableMem:15G874M13G130M1.2G14GSwap:31G0B31G參數說明:total:總內存大小 。used:已經使用的內存大小(這里面包含cached和buffers和shared部分) 。free:空閑的內存大小 。shared:進程間共享內存(一般不會用,可以忽略) 。buffers:內存中寫完的東西緩存起來,這樣快速響應請求,后面數據再定期刷到磁盤上 。cached:內存中讀完緩存起來內容占的大小(這部分是為了下次查詢時快速返回) 。available:還可以被應用程序使用的物理內存大小,和free的區別是,free是真正未被使用的內存,available是包括buffers、cached的 。Swap:硬盤上交換分區的使用大小 。Buffer和Cache
Cache(緩存),為了調高CPU和內存之間數據交換而設計,Buffer(緩沖)為了提高內存和硬盤(或其他I/O設備的數據交換而設計) 。
Cache主要是針對讀操作設計的,不過Cache概念可能容易混淆,我理解為CPU本身就有Cache,包括一級緩存、二級緩存、三級緩存,我們知道CPU所有的指令操作對接的都是內存,而CPU的處理能力遠高于內存速度,所以為了不讓CPU資源閑置,Intel等公司在CPU內部集成了一些Cache,但畢竟不能放太多電路在里面,所以這部分Cache并不是很大,主要是用來存放一些常用的指令和常用數據,真正大部分Cache的數據應該是占用內存的空間來緩存請求過的數據,即上面的Cached部分(這部分純屬個人理解,正確與否有待考證) 。
Buffer主要是針對寫操作設計的,更細的說是針對內存和硬盤之間的寫操作來設計的,目的是將寫的操作集中起來進行,減少磁盤碎片和硬盤反復尋址過程,提高性能 。
在Linux系統內部有一個守護進程會定期清空Buffer中的內容,將其寫入硬盤內,當手動執行sync命令時也會觸發上述操作 。
Swap
雖然現在的內存已經變得非常廉價,但是swap仍然有很大的使用價值,合理的規劃和使用swap分區,對系統穩定運行至關重要 。
Linux下可以使用文件系統中的一個常規文件或者一個獨立分區作為交換空間使用 。同時linux允許使用多個交換分區或者交換文件 。
內存泄漏和內存溢出
內存溢出(OOM,out of memory),是指程序在申請內存時,沒有足夠的內存空間供其使用,出現out of memory;比如申請了一個integer,但給它存了long才能存下的數,那就是內存溢出 。
內存泄露(memory leak),是指程序在申請內存后,無法釋放已申請的內存空間,一次內存泄露危害可以忽略,但內存泄露堆積后果很嚴重,無論多少內存,遲早會被占光 。
如何判斷內存泄露
用 jstat -gcutil PID,觀察Old這個參數,如果每次執行完FULLGC之后Old區的值一次比一次升高,就可以判斷為發生了內存泄漏 。
如何判斷內存溢出
Heap Dump(堆轉儲文件)它是一個Java進程在某個時間點上的內存快照 。Heap Dump是有著多種類型的 。不過總體上heap dump在觸發快照的時候都保存了java對象和類的信息 。通常在寫heap dump文件前會觸發一次FullGC,所以heap dump文件中保存的是FullGC后留下的對象信息 。
通過設置如下的JVM參數,可以在發生OutOfMemoryError后獲取到一份HPROF二進制Heap Dump文件:
-XX:+HeapDumpOnOutOfMemoryError
生成的文件會直接寫入到工作目錄 。
注意:該方法需要JDK5以上版本 。
轉存堆內存信息后,需要對文件進行分析,從而找到OOM的原因 。可以使用以下方式:
mat:eclipse memory analyzer, 基于eclipse RCP的內存分析工具 。具體使用參考:http://www.eclipse.org/mat/
jhat:JDK自帶的java heap analyze tool,可以將堆中的對象以html的形式顯示出來,包括對象的數量,大小等等,并支持對象查詢語言OQL,分析相關的應用后,可以通過http://localhost:7000來訪問分析結果 。不推薦使用 。
OOM常見原因及解決方案
【linux 釋放內存 釋放內存的命令】可參考高手總結的9種 OOM 常見原因及解決方案
釋放內存
在Linux系統下,我們一般不需要去釋放內存,因為系統已經將內存管理的很好 。但是凡事也有例外,有的時候內存會被緩存占用掉,導致系統使用SWAP空間影響性能,例如當你在linux下頻繁存取文件后,物理內存會很快被用光,當程序結束后,內存不會被正常釋放,而是一直作為caching 。此時就需 要執行釋放內存(清理緩存)的操作了 。
釋放內存操作:
bash
sync# 強制將內存中的緩存寫入磁盤echo 數字 > /proc/sys/vm/drop_caches #數字可以是0-3的整數數字含義:0:不釋放(系統默認值)1:釋放頁緩存2:釋放dentries和inodes3:釋放所有緩存什么是內存Linux內存回收機制查看Linux內存情況查看/proc/meminfo使用free命令查看Buffer和CacheSwap內存泄漏和內存溢出如何判斷內存泄露如何判斷內存溢出OOM常見原因及解決方案釋放內存
- linux 設置系統時間函數 linux系統設置時間命令
- sd數據庫檢索方式 sd數據庫檢索途徑
- linux常用命令查看ip地址 Linux查ip地址命令
- linux網卡自啟動命令 linux重新啟動網卡命令
- linux操作系統位數查看 linux查詢系統位數
- linux系統好用嗎 可以用office嗎 linux系統好用不
- Linux查看本機IP linux常用命令查看ip
- linux重啟apache服務器命令 怎么重啟apache服務器
- 備份linux系統到u盤 linux系統整機備份
- 定時任務 環境變量 linux設置臨時環境變量命令
