当前位置: 首页 > 知识库问答 >
问题:

获取堆上可用内存的大小

拓拔奇
2023-03-14

这是Linux的平台相关问题。如果有关系的话,我会特别询问C-11之前的情况。

我想通过newdelete间接测试类的析构函数,以查看程序堆上的所有内存是否都已释放,从而检查内存泄漏。

object* x;        //pointer allocated on the stack
...               //measure available heap space
x = new object(); //allocated on the heap
delete x;         //deallocate that heap space
...               //measure again, see if it's the same

我知道Valgrind有Massif(...有Massif的C库吗...?),我甚至可以对我的整个程序运行内存泄漏检查,但是代码会改变。单元测试很重要,我不能完全单元测试我所有的代码,这让我非常恼火。

我可以编写哪些代码来度量可用堆空间?

共有1个答案

危裕
2023-03-14

在Linux中,堆栈和堆之间的区别有些模糊。堆栈只是内存,其顶部交给创建新任务的clone()调用。新进程和新线程都是如此。分配器运算符是系统调用的包装器brk/sbrk。您最好的选择是覆盖全局运算符new/运算符new[]运算符delete/运算符delete[]来对调用进行某种计数,这样您就可以在运行时对其进行检查。

快速通读新表达式可以让您很好地了解对象创建/销毁时发生的顺序(如果您已经知道,请原谅),并且运算符new将告诉查找分配器的顺序。这一点我可能错了,但为了让所有分配器都通过同一点从操作系统请求内存,即使是特定于类的操作符new最终也必须调用全局操作符new

特定于类的类可以使用分配器将mmap内存映射到文件,或者shmget将对象映射到共享内存中的某个存储,但在这两种情况下,它都不是传统上称为“堆”的一部分在linux中运行“top”时,堆栈和堆都驻留在“VIRT”内存中。

除此之外,由malloc分配并传递给clone调用(例如,该调用创建一个新线程)作为新线程堆栈的内存与用作堆的内存没有什么不同。

 类似资料:
  • 问题内容: 有什么好的方法可以在运行时将剩余的内存提供给JVM?这种情况的用例是使Web服务在接近内存限制时通过拒绝一个新的错误消息“太多的人使用此,请稍后再试”,而不是因OutOfMemory错误而突然死亡而接近失败,从而正常失败。 注意,这与事先计算/估算每个对象的成本无关。原则上,我可以根据该估算值估算对象占用并拒绝新连接的内存量,但这似乎有点hacky /脆弱。 问题答案: 这是该主题给出

  • 上面链接中的代码正在工作,但可以传输到一定数量的数据。当我试图传输一个大小约为334 MB的.mkv格式的电影时,它给出了“内存不足,java堆大小”的错误。我是一个乞丐,我不知道如何解决这个问题,我试图在客户端程序中增加缓冲区大小,但问题仍然存在。请帮帮我.

  • 问题内容: 有谁知道如何获得变量(内存大小,,等),并打印出来?可能吗? 问题答案: 您可以为此使用unsafe.Sizeof函数。它返回以字节为单位的大小,该大小由您传递给它的值占据。这是一个工作示例: 请注意,某些平台明确禁止使用不安全,因为它是不安全的。这曾经包括AppEngine。不知道今天是否仍然如此,但我想是这样。 正如@Timur Fayzrakhmanov指出的那样,它将为您提供相

  • 问题内容: 对于我的应用程序,Java进程使用的内存远远大于堆大小。 容器运行所在的系统开始出现内存问题,因为容器占用的内存比堆大小大得多。 堆大小设置为128 MB(-),而容器最多占用1GB的内存。正常情况下需要500MB。如果docker容器的限制低于(例如),则该进程将被操作系统的内存不足杀手杀死。 你能解释一下为什么Java进程使用的内存比堆多得多吗?如何正确调整Docker内存限制的大

  • 我想分配大约1GB的堆大小,但我似乎无法弄清楚。 如何做到这一点?

  • 我正在为我的计算机科学专业学习C语言的操作系统课程。 我很好奇这是否与分配内存时浪费的空间有关,以及这是否在任何计算机操作系统上有所不同,我理解内存的排列方式可以以最适合系统的任何顺序进行。

  • 问题内容: 尝试在Eclipse中启动和运行flex / java项目时,我一直使用Eclipse,Tomcat和JRE收到“内存不足异常”和“ Java堆空间”。 在研究尝试调整内存设置时,我发现了三个地方来调整这些设置: Eclipse.ini 窗口>首选项下的JRE设置 Catalina.sh或Catalina.bat 在这些不同位置设置-xms和-xmx有什么区别,这是什么意思? 有什么方

  • PS:有时我会从java代码执行shell脚本。会不会导致这类问题?