当前位置: 首页 > 面试题库 >

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

伯英武
2023-03-14
问题内容

我在写一些代码,但一直崩溃。后来,在挖掘转储之后,我意识到我正在超出最大堆限制(如果我在malloc上添加了检查,生活会更轻松)。尽管我已解决问题,但是有什么办法可以增加堆大小?


问题答案:

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

您应该使用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 = %zi\n",maxMemMiB);
                        memset(memPointer,0,maxMemMiB);
                        free(memPointer);
                }
                maxMemMiB+=oneHundredMiB;
                memPointer=malloc(maxMemMiB);
        }while(memPointer != NULL);
        printf("Max Usable Memory aprox = %zi\n",maxMemMiB-oneHundredMiB);
        return 0;
}

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

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

话虽如此。在我正在编写此文件的系统中,没有崩溃。上面的程序报告与ulimit -a。不同之处在于,它实际上html" target="_blank">测试了内存,并且通过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) ;

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



 类似资料:
  • 问题内容: 我发现的唯一 好 方法是: (资料来源) 但这可靠吗?它适用于每个流程和每个发行版吗? 问题答案: 毕竟,Mark的答案就是解决之道,这就是/ proc文件系统在那里的原因。对于一些复制/粘贴的东西:

  • 我想检查我的应用程序是否很好地获得选项。 java进程在docker容器中运行。 为了做到这一点,我要找到所创建进程的最大堆大小。 null 假设(ngcmx+ogcmx)=()可以吗? https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html

  • 问题内容: 如何确定Linux中程序的当前堆栈大小? 据说每个程序的堆栈大小在Linux中将是8 MB,但是当您使用cat / proc // mmap时,它将显示不同的大小。 另外,如何确定相关线程的堆栈大小?既然说线程有自己的私有堆栈? 问题答案: 如果仅需要当前的堆栈大小,则可以在main()的顶部声明一个变量,获取其地址,然后将其与在定义“当前”的位置声明的变量的地址进行比较。差异应为堆栈

  • 我得到: 但是当我键入: 控制台没有返回任何内容,并且卡在“java模式”中,感觉就像称为java的命令及其等待我的输入一样,我键入的任何内容都不会返回任何内容...直到我键入 crt C 它退出模式...

  • 如何通过命令行检查Linux上Java应用程序的堆大小(和使用的内存)? 我已经通过jmap试过了。但它提供了信息。关于Eden/PermGen等内部记忆区域,这对我来说没用。 我在寻找这样的东西: 最大内存:1GB 这就是全部。我知道我可以在JConsole等中看到这一点,但我需要通过命令行来实现。(无法启用JMX等)

  • 问题内容: 我对此有一些奇怪的问题。 我们正在使用Xvfb虚拟桌面管理器,并希望在继续之前确保其正在运行。使用纯外壳,我可以轻松地做到这一点: 这正是我所需要的,只有一行包含有关Xvfb proc的信息。接下来,我要将其合并到我的Java程序中并解析结果并存储正在运行的Xvfb进程的PID。所以我正在尝试: 奇怪的是,如果我使用“ ps -ef”,则在运行我的应用程序时,会得到大量的进程转储到控制