![如何从地址空间计算进程的堆大小?](https://linux22.com/image/117942/%E5%A6%82%E4%BD%95%E4%BB%8E%E5%9C%B0%E5%9D%80%E7%A9%BA%E9%97%B4%E8%AE%A1%E7%AE%97%E8%BF%9B%E7%A8%8B%E7%9A%84%E5%A0%86%E5%A4%A7%E5%B0%8F%EF%BC%9F.png)
我试图找到我的进程正在使用的堆大小。我做到了
fgrep '[stack]' /proc/pid/maps
并得到了
00a00000-45937000 rw-p 00000000 00:00 0 [heap]
现在我想计算堆的大小。所以我做了
(45937000 - 00a00000 ) = 44F37000
将其转换为十进制1156804608
。然后到 GB = 1156804608/(1000*1000*1000) = 1.1568 GB
.
我正在做的事情正确吗?
答案1
是的,用结束边界地址减去开始边界地址就可以得到该特定进程中堆的大小。
计算可以在 shell 中进行
hsize=$(( 0x45937000 - 0x00a00000 + 1 ))
printf 'heap is %d bytes (about %d MiB)\n' \
"$hsize" "$(( hsize / 1024 / 1024 ))"
使用 GNUawk
解析maps
PID 的“文件” $pid
(GNUawk
需要-n
能够识别非十进制整数):
awk -n -F '[- ]' '/\[heap\]/ {
h = "0x" $2 - "0x" $1 + 1
printf("heap is %d bytes (%.2f MiB)\n", h, h/1024/1024) }' /proc/$pid/maps
另请参阅此相关问题:Linux下如何读取/proc/$pid/mem?
关于 ServerFault 的这个问题也可能有用,具体取决于您想要做什么:将 Linux 进程的内存转储到文件