作者:夏斯華
像使用C/C++內存管理器不會幫我們自動回收不再使用的內存,如果忘記釋放不再使用的內存而不能再被重用,就造成了所謂的內存泄露。
在Linux中,用戶進程在/proc/{pid}/status文件中記錄了該進程的內存使用實時情況。
* VmSize:
虛擬內存大小。
整個進程使用虛擬內存大小,是VmLib, VmExe, VmData, 和 VmStk的總和。
* VmLck:
虛擬內存鎖。
進程當前使用的並且加鎖的虛擬內存總數
* VmRSS:
虛擬內存駐留集合大小。
這是駐留在物理內存的一部分。它沒有交換到硬盤。它包括代碼,數據和棧。
* VmData:
虛擬內存數據。
堆使用的虛擬內存。
* VmStk:
虛擬內存棧
棧使用的虛擬內存
* VmExe:
可執行的虛擬內存
可執行的和靜態鏈接庫所使用的虛擬內存
* VmLib:
虛擬內存庫
動態鏈接庫所使用的虛擬內存
我們可以寫個腳本,把你關注的進程或者所有的進程(ps –ef),的內存使用情況,主要針對VmSize,VmData,VmStk三個方面每隔比如3小時記錄到進程號對應的文件中,每次記錄下一個的時候,做個比較,如果發現最後一個記錄點比第一個記錄點小無內存泄露,如果大還需要與第二個記錄點的大小(排除系統啓動時的內存增長需要時間穩定下來),如果大的話就說明有內存泄露。還有記錄點不要太多,比如30個,超過了就刪除除了第一個記錄點外的倒數第二個老的記錄點。檢測出內存泄露,可以打到異常日誌中,供查看。
我們需要去查看那日誌,發現有泄露,會看是什麼原因的,至少可以知道是哪個進程的以及是棧還是堆上的,然後再分析代碼…