栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在Linux上检查进程的堆大小

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在Linux上检查进程的堆大小

堆通常与体系结构上可寻址的虚拟内存一样大。

您应该使用

ulimit -a
命令检查系统的当前限制,并找到这行最大值
memory size (kbytes, -m)3008828
,在我的OpenSuse 11.4 x86_64上,此行具有约3.5 GiB的ram,表示每个进程大约有3GB的ram。

然后,您可以使用以下简单程序真正测试您的系统,以检查每个进程的最大可用内存:

#include <stdio.h>#include <stdlib.h>#include <string.h>int main(int argc,char* argv[]){        size_t oneHundredMiB=100*1048576;        size_t maxMemMiB=0;        void *memPointer = NULL;        do{     if(memPointer != NULL){  printf("Max Tested Memory = %zin",maxMemMiB);  memset(memPointer,0,maxMemMiB);  free(memPointer);     }     maxMemMiB+=oneHundredMiB;     memPointer=malloc(maxMemMiB);        }while(memPointer != NULL);        printf("Max Usable Memory aprox = %zin",maxMemMiB-oneHundredMiB);        return 0;}

该程序以100MiB的增量获取内存,显示当前分配的内存,在其上分配0,然后释放内存。当系统无法提供更多内存时,返回NULL并显示最终的可用ram最大值。

需要注意的是,您的系统将在最后阶段开始大量交换内存。根据您的系统配置,内核可能决定终止某些进程。我使用100
MiB增量,因此某些应用程序和系统有一定的喘息空间。您应该关闭所有您不想崩溃的东西。

话虽如此。在我正在编写此文件的系统中,没有崩溃。上面的程序报告与

ulimit-a
。不同之处在于,它实际上测试了内存,并且通过
memset()
确认已指定并使用了内存。

为了在具有256 MiB的ram和400MiB的swap的Ubuntu 10.04x86 VM上进行比较,ulimit报告是

memory size(kbytes, -m)unlimited
,我的小程序报告了524.288.000字节,这大约是ram和swap的组合,不包括其他软件和内核使用的ram。

编辑:正如Adam Zalcman所写,

ulimit -m
在新的2.6及更高版本的linux内核上不再受尊敬,因此,我更正了。但是
ulimit-v
很荣幸。为了获得实际结果,应将-m替换为-v,然后查找
virtual memory (kbytes, -v) 4515440
。我的suse框的-
m值似乎与我的小工具报告的恰好相符,这几乎没有机会。您应该记住,这是内核分配的虚拟内存,如果物理内存不足,则会占用交换空间来弥补它。

如果您想知道有多少可用的物理内存而不干扰任何过程或系统,则可以使用

long total_available_ram =sysconf(_SC_AVPHYS_PAGES) * sysconf(_SC_PAGESIZE);

这将不包括高速缓存和缓冲内存,因此此数字可能远远小于实际的可用内存。操作系统缓存可能非常安静,逐出它们可以提供所需的额外内存,但这由内核处理。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/403052.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号