Linux性能優(yōu)化:內(nèi)存使用情況分析
點擊上方藍(lán)色字體,選擇“標(biāo)星公眾號”
優(yōu)質(zhì)文章,第一時間送達
作者 | 不羈的羅恩
來源 | urlify.cn/I3a2M3
什么是內(nèi)存
內(nèi)存(Memory)是計算機的重要部件之一,也稱內(nèi)存儲器和主存儲器,它用于暫時存放CPU中的運算數(shù)據(jù),與硬盤等外部存儲器交換的數(shù)據(jù)。
它是外存與CPU進行溝通的橋梁,計算機中所有程序的運行都在內(nèi)存中進行,內(nèi)存性能的強弱影響計算機整體發(fā)揮的水平。
只要計算機開始運行,操作系統(tǒng)就會把需要運算的數(shù)據(jù)從內(nèi)存調(diào)到CPU中進行運算,當(dāng)運算完成,CPU將結(jié)果傳送出來。
內(nèi)存的運行也決定計算機整體運行快慢的程度。
Linux內(nèi)存回收機制
為啥要回收:
內(nèi)核需要為任何時刻突發(fā)到來的內(nèi)存申請?zhí)峁┳銐虻膬?nèi)存,以便cache的使用和其他相關(guān)內(nèi)存的使用不至于讓系統(tǒng)的剩余內(nèi)存長期處于很少的狀態(tài)。
當(dāng)真的有大于空閑內(nèi)存的申請到來的時候,會觸發(fā)強制內(nèi)存回收。
內(nèi)存回收針對的目標(biāo)有兩種,一種是針對zone的,另一種是針對一個memcg的,把針對zone的內(nèi)存回收方式分為三種,分別是快速內(nèi)存回收、直接內(nèi)存回收、kswapd內(nèi)存回收。
查看Linux內(nèi)存情況
查看/proc/meminfo
[root@test ~]# cat /proc/meminfo
MemTotal: 16166688 kB
MemFree: 14051412 kB
MemAvailable: 14772588 kB
Buffers: 2116 kB
Cached: 1073260 kB
SwapCached: 0 kB
Active: 770384 kB
Inactive: 698264 kB
Active(anon): 450156 kB
Inactive(anon): 76748 kB
Active(file): 320228 kB
Inactive(file): 621516 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 33554428 kB
SwapFree: 33554428 kB
Dirty: 476 kB
Writeback: 0 kB
AnonPages: 393328 kB
Mapped: 153828 kB
Shmem: 133628 kB
Slab: 246448 kB
SReclaimable: 133892 kB
SUnreclaim: 112556 kB
KernelStack: 13472 kB
PageTables: 30496 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 41637772 kB
Committed_AS: 4257776 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 320696 kB
VmallocChunk: 34350426108 kB
HardwareCorrupted: 0 kB
AnonHugePages: 155648 kB
CmaTotal: 0 kB
CmaFree: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 279276 kB
DirectMap2M: 6965248 kB
DirectMap1G: 11534336 kB使用free命令查看
[root@test ~]# free -h
total used free shared buff/cache available
Mem: 15G 874M 13G 130M 1.2G 14G
Swap: 31G 0B 31G參數(shù)說明:
total:總內(nèi)存大小。
used:已經(jīng)使用的內(nèi)存大小(這里面包含cached和buffers和shared部分)。
free:空閑的內(nèi)存大小。
shared:進程間共享內(nèi)存(一般不會用,可以忽略)。
buffers:內(nèi)存中寫完的東西緩存起來,這樣快速響應(yīng)請求,后面數(shù)據(jù)再定期刷到磁盤上。
cached:內(nèi)存中讀完緩存起來內(nèi)容占的大小(這部分是為了下次查詢時快速返回)。
available:還可以被應(yīng)用程序使用的物理內(nèi)存大小,和free的區(qū)別是,free是真正未被使用的內(nèi)存,available是包括buffers、cached的。
Swap:硬盤上交換分區(qū)的使用大小。
Buffer和Cache
Cache(緩存),為了調(diào)高CPU和內(nèi)存之間數(shù)據(jù)交換而設(shè)計,Buffer(緩沖)為了提高內(nèi)存和硬盤(或其他I/O設(shè)備的數(shù)據(jù)交換而設(shè)計)。
Cache主要是針對讀操作設(shè)計的,不過Cache概念可能容易混淆,我理解為CPU本身就有Cache,包括一級緩存、二級緩存、三級緩存,我們知道CPU所有的指令操作對接的都是內(nèi)存,而CPU的處理能力遠(yuǎn)高于內(nèi)存速度,所以為了不讓CPU資源閑置,Intel等公司在CPU內(nèi)部集成了一些Cache,但畢竟不能放太多電路在里面,所以這部分Cache并不是很大,主要是用來存放一些常用的指令和常用數(shù)據(jù),真正大部分Cache的數(shù)據(jù)應(yīng)該是占用內(nèi)存的空間來緩存請求過的數(shù)據(jù),即上面的Cached部分(這部分純屬個人理解,正確與否有待考證)。
Buffer主要是針對寫操作設(shè)計的,更細(xì)的說是針對內(nèi)存和硬盤之間的寫操作來設(shè)計的,目的是將寫的操作集中起來進行,減少磁盤碎片和硬盤反復(fù)尋址過程,提高性能。
在Linux系統(tǒng)內(nèi)部有一個守護進程會定期清空Buffer中的內(nèi)容,將其寫入硬盤內(nèi),當(dāng)手動執(zhí)行sync命令時也會觸發(fā)上述操作。
Swap
雖然現(xiàn)在的內(nèi)存已經(jīng)變得非常廉價,但是swap仍然有很大的使用價值,合理的規(guī)劃和使用swap分區(qū),對系統(tǒng)穩(wěn)定運行至關(guān)重要。
Linux下可以使用文件系統(tǒng)中的一個常規(guī)文件或者一個獨立分區(qū)作為交換空間使用。同時linux允許使用多個交換分區(qū)或者交換文件。
內(nèi)存泄漏和內(nèi)存溢出
內(nèi)存溢出(OOM,out of memory),是指程序在申請內(nèi)存時,沒有足夠的內(nèi)存空間供其使用,出現(xiàn)out of memory;比如申請了一個integer,但給它存了long才能存下的數(shù),那就是內(nèi)存溢出。
內(nèi)存泄露(memory leak),是指程序在申請內(nèi)存后,無法釋放已申請的內(nèi)存空間,一次內(nèi)存泄露危害可以忽略,但內(nèi)存泄露堆積后果很嚴(yán)重,無論多少內(nèi)存,遲早會被占光。
如何判斷內(nèi)存泄露
用 jstat -gcutil PID,觀察Old這個參數(shù),如果每次執(zhí)行完FULLGC之后Old區(qū)的值一次比一次升高,就可以判斷為發(fā)生了內(nèi)存泄漏。
如何判斷內(nèi)存溢出
Heap Dump(堆轉(zhuǎn)儲文件)它是一個Java進程在某個時間點上的內(nèi)存快照。Heap Dump是有著多種類型的。不過總體上heap dump在觸發(fā)快照的時候都保存了java對象和類的信息。通常在寫heap dump文件前會觸發(fā)一次FullGC,所以heap dump文件中保存的是FullGC后留下的對象信息。
通過設(shè)置如下的JVM參數(shù),可以在發(fā)生OutOfMemoryError后獲取到一份HPROF二進制Heap Dump文件:
-XX:+HeapDumpOnOutOfMemoryError
生成的文件會直接寫入到工作目錄。
注意:該方法需要JDK5以上版本。
轉(zhuǎn)存堆內(nèi)存信息后,需要對文件進行分析,從而找到OOM的原因??梢允褂靡韵路绞剑?/span>
mat:eclipse memory analyzer, 基于eclipse RCP的內(nèi)存分析工具。具體使用參考:http://www.eclipse.org/mat/
jhat:JDK自帶的java heap analyze tool,可以將堆中的對象以html的形式顯示出來,包括對象的數(shù)量,大小等等,并支持對象查詢語言O(shè)QL,分析相關(guān)的應(yīng)用后,可以通過http://localhost:7000來訪問分析結(jié)果。不推薦使用。
OOM常見原因及解決方案
可參考高手總結(jié)的9種 OOM 常見原因及解決方案
釋放內(nèi)存
在Linux系統(tǒng)下,我們一般不需要去釋放內(nèi)存,因為系統(tǒng)已經(jīng)將內(nèi)存管理的很好。但是凡事也有例外,有的時候內(nèi)存會被緩存占用掉,導(dǎo)致系統(tǒng)使用SWAP空間影響性能,例如當(dāng)你在linux下頻繁存取文件后,物理內(nèi)存會很快被用光,當(dāng)程序結(jié)束后,內(nèi)存不會被正常釋放,而是一直作為caching。此時就需 要執(zhí)行釋放內(nèi)存(清理緩存)的操作了。
釋放內(nèi)存操作:
sync # 強制將內(nèi)存中的緩存寫入磁盤
echo 數(shù)字 > /proc/sys/vm/drop_caches #數(shù)字可以是0-3的整數(shù)數(shù)字含義:
0:不釋放(系統(tǒng)默認(rèn)值)
1:釋放頁緩存
2:釋放dentries和inodes
3:釋放所有緩存
粉絲福利:Java從入門到入土學(xué)習(xí)路線圖
??????

??長按上方微信二維碼 2 秒
感謝點贊支持下哈 
