在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的原因 ??梢允褂靡韵路绞剑?br />
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)存操作:
bash
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:釋放所有緩存
- 什么是內(nèi)存
- Linux內(nèi)存回收機制
- 查看Linux內(nèi)存情況
- 查看/proc/meminfo
- 使用free命令查看
- Buffer和Cache
- Swap
- 內(nèi)存泄漏和內(nèi)存溢出
- 如何判斷內(nèi)存泄露
- 如何判斷內(nèi)存溢出
- OOM常見原因及解決方案
- 釋放內(nèi)存
推薦閱讀
- linux命令修改系統(tǒng)時間方法 linux設(shè)置系統(tǒng)時間函數(shù)
- linux下mysql安裝教程 mysql創(chuàng)建用戶的命令
- cad塊編輯命令 cad如何編輯塊的屬性
- 網(wǎng)址查詢域名解析 解析dns命令
- 最流暢的linux桌面系統(tǒng) arch linux安裝
- centos7永久修改主機名命令 centos7更改主機名怎么配置
- linux服務(wù)器清理緩存方法 linux清緩存怎么清理
- linux聯(lián)網(wǎng)設(shè)置方法 linux怎么上網(wǎng)搜索
- ubuntu系統(tǒng)關(guān)閉防火墻命令 ubuntu防火墻設(shè)置
- linux虛擬機安裝mysql步驟 虛擬機安裝mysql是數(shù)據(jù)庫
