linux--shell腳本記錄進程內存變化top | VmRSS | VmSize(內存泄漏)


linux--shell腳本記錄進程內存變化VmRSS|VmSize(內存泄漏)

1 介紹
2 虛擬內存(Virtual Memory)與駐留內存(Resident Memory)
2.1 虛擬內存(Virtual Memory)
概述
詳述
2.2 駐留內存(Resident Memory)
3 top中的VIRT、RES和SHR
3.1 VIRT--虛擬內存空間的大小
3.2 RES--已經映射到物理內存空間的大小
3.3 SHR--共享物理內存大小
4 /proc/{pid}/status
5 如下每10分鍾統計一次
參考
1 介紹

記錄進程的內存增長情況,定位是否內存泄漏。

2 虛擬內存(Virtual Memory)與駐留內存(Resident Memory)

2.1 虛擬內存(Virtual Memory)

概述

虛擬內存是一個假象的內存空間,在程序運行過程中虛擬內存空間中需要被訪問的部分會被映射到物理內存空間中。虛擬內存空間大只能表示程序運行過程中可訪問的空間比較大,不代表物理內存空間占用也大。
詳述

進程占用虛擬內存空間大並非意味着程序的物理內存也一定占用很大。**虛擬內存是操作系統內核為了對進程地址空間進行管理(process address space management)而精心設計的一個邏輯意義上的內存空間概念。**我們程序中的指針其實都是這個虛擬內存空間中的地址。比如我們在寫完一段C++程序之后都需要采用g++進行編譯,這時候編譯器采用的地址其實就是虛擬內存空間的地址。因為這時候程序還沒有運行,何談物理內存空間地址?**凡是程序運行過程中可能需要用到的指令或者數據都必須在虛擬內存空間中。**既然說虛擬內存是一個邏輯意義上(假象的)的內存空間,為了能夠讓程序在物理機器上運行,那么必須有一套機制可以讓這些假象的虛擬內存空間映射到物理內存空間(實實在在的RAM內存條上的空間)。這其實就是操作系統中頁映射表(page table)所做的事情了。內核會為系統中每一個進程維護一份相互獨立的頁映射表。頁映射表的基本原理是將程序運行過程中需要訪問的一段虛擬內存空間通過頁映射表映射到一段物理內存空間上,這樣CPU訪問對應虛擬內存地址的時候就可以通過這種查找頁映射表的機制訪問物理內存上的某個對應的地址。“頁(page)”是虛擬內存空間向物理內存空間映射的基本單元。
下圖演示了虛擬內存空間和物理內存空間的相互關系,它們通過Page Table關聯起來。其中虛擬內存空間中着色的部分分別被映射到物理內存空間對應相同着色的部分。而虛擬內存空間中灰色的部分表示在物理內存空間中沒有與之對應的部分,也就是說灰色部分沒有被映射到物理內存空間中。這么做也是本着“按需映射”的指導思想,因為虛擬內存空間很大,可能其中很多部分在一次程序運行過程中根本不需要訪問,所以也就沒有必要將虛擬內存空間中的這些部分映射到物理內存空間上。

2.2 駐留內存(Resident Memory)

駐留內存,顧名思義是指那些被映射到進程虛擬內存空間的物理內存。上圖中,**在系統物理內存空間中被着色的部分都是駐留內存。**比如,A1、A2、A3和A4是進程A的駐留內存;B1、B2和B3是進程B的駐留內存。進程的駐留內存就是進程實實在在占用的物理內存。**一般我們所講的進程占用了多少內存,其實就是說的占用了多少駐留內存而不是多少虛擬內存。**因為虛擬內存大並不意味着占用的物理內存大。

3 top中的VIRT、RES和SHR

3.1 VIRT–虛擬內存空間的大小

VIRT表示的是進程虛擬內存空間大小。對應到圖1中的進程A來說就是A1、A2、A3、A4以及灰色部分所有空間的總和。也就是說VIRT包含了在已經映射到物理內存空間的部分和尚未映射到物理內存空間的部分總和。

3.2 RES–已經映射到物理內存空間的大小

RES的含義是指進程虛擬內存空間中已經映射到物理內存空間的那部分的大小。對應到圖1中的進程A來說就是A1、A2、A3以及A4幾個部分空間的總和。所以說,看進程在運行過程中占用了多少內存應該看RES的值而不是VIRT的值。

3.3 SHR–共享物理內存大小

SHR是share(共享)的縮寫,它表示的是進程占用的共享內存大小。在上圖1中我們看到進程A虛擬內存空間中的A4和進程B虛擬內存空間中的B3都映射到了物理內存空間的A4/B3部分。咋一看很奇怪。為什么會出現這樣的情況呢?其實我們寫的程序會依賴於很多外部的動態庫(.so),比如libc.so、libld.so等等。這些動態庫在內存中僅僅會保存/映射一份,如果某個進程運行時需要這個動態庫,那么動態加載器會將這塊內存映射到對應進程的虛擬內存空間中。**多個進程之間通過共享內存的方式相互通信也會出現這樣的情況。**這么一來,就會出現不同進程的虛擬內存空間會映射到相同的物理內存空間。這部分物理內存空間其實是被多個進程所共享的,所以我們將他們稱為共享內存,用SHR來表示。某個進程占用的內存除了和別的進程共享的內存之外就是自己的獨占內存了。所以要計算進程獨占內存的大小只要用RES的值減去SHR值即可。

4 /proc/{pid}/status

在Linux中,用戶進程在/proc/{pid}/status文件中記錄了該進程的內存使用實時情況。
VmSize:
虛擬內存大小。
整個進程使用虛擬內存大小,是VmLib, VmExe, VmData, 和 VmStk的總和。
VmLck:
虛擬內存鎖。
進程當前使用的並且加鎖的虛擬內存總數
VmRSS:
虛擬內存駐留集合大小。
這是駐留在物理內存的一部分。它沒有交換到硬盤。它包括代碼,數據和棧。
VmData:
虛擬內存數據。
堆使用的虛擬內存。
VmStk:
虛擬內存棧
棧使用的虛擬內存
VmExe:
可執行的虛擬內存
可執行的和靜態鏈接庫所使用的虛擬內存
VmLib:
虛擬內存庫
動態鏈接庫所使用的虛擬內存
5 如下每10分鍾統計一次

# desc: get process meminfo every 10 mins.
# author: worthsen

#!/bin/sh

pid=3158
interval=600

echo $pid
while true
do
DATE=`date '+%Y-%m-%d-%H:%M:%S'`
echo $DATE >> proc_memlog.txt
#echo VmRSS: >> proc_memlog.txt
cat /proc/$pid/status|grep -e VmRSS >> proc_memlog.txt
cat /proc/$pid/status|grep -e VmSize >> proc_memlog.txt
echo $blank >> proc_memlog.txt
sleep $interval
done

參考

1、
2、linux top命令VIRT,RES,SHR,DATA的含義
3、進程的虛擬內存,物理內存,共享內存
4、觀察進程的內存占用情況
5、top命令介紹、實存(RES) 與 虛存(VIRT)區別 ——VIRT持續增長,記一次內存泄漏定位
6、worthsen–linux–內存泄漏介紹與工具

文章知識點與官方知識檔案匹配,可進一步學習相關知識
————————————————
版權聲明:本文為CSDN博主「worthsen」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_38880380/article/details/120234641


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM