linux newdelete,mallocfree大内存块

linux newdelete,mallocfree大内存块,第1张

概述linux new / delete,malloc / free大内存

我们有一个运行多个CORBA服务器进程的linux系统(kubuntu 7.10)。 服务器软件使用glibc库进行内存分配。 linux电脑有4G物理内存。 由于速度原因,交换被禁用。

在收到处理数据的请求后,其中一个服务器进程分配一个大的数据缓冲区(使用标准的C ++运算符'new')。 缓冲区大小取决于许多参数,但通常在1.2G字节左右。 它可以达到约1.9G字节。 当请求完成时,使用'delete'释放缓冲区。

这适用于分配相同大小的缓冲区的几个连续请求,或者如果请求分配比前一个更小的大小。 内存似乎是免费的 – 否则缓冲区分配尝试最终会失败,只需几个请求。 在任何情况下,我们都可以看到使用KSysGuard等工具为每个请求分配和释放缓冲区内存。

当一个请求需要一个比前一个更大的缓冲区时,就会出现问题。 在这种情况下,运算符“new”引发exception。 就好像已经从第一次分配中释放的内存不能被重新分配,即使有足够的空闲物理内存可用。

logging内存访问会导致严重的页面错误

限制ubuntu上的jvm进程内存

linux共享内存在哪里?

使用C中包含多个Null字符的string

在windows 7 64位上运行16位命令行应用程序

如果我在第一次 *** 作之后终止并重新启动服务器进程,则第二次请求更大的缓冲区大小会成功。 即杀死进程似乎完全释放释放的内存回到系统。

任何人都可以提供关于这里可能发生的事情的解释吗? 这可能是某种碎片或映射表的大小问题? 我正在考虑用malloc / freereplacenew / delete,并使用mallopt来调整内存被释放到系统的方式。

顺便说一句 – 我不知道它是否与我们的问题有关,但服务器使用Pthreads创build和销毁每个处理请求。

我可以从指针地址(linux上的C)获得NUMA节点吗?

如何在windows中为进程分配超过2GB的内存?

在windows初始化静态全局variables时,新返回NulL?

打开具有deBUGging权限和读/写内存的进程

Java耗尽内存,即使我给它足够的!

如果这是一个32位的机器,你将拥有3Gb的地址空间 – 1Gb是为内核预留的。否则,共享库,exe文件,数据段等将占用相当多的地址空间你应该看看/proc/pID/maps来看看地址空间是如何布局的。

有多少物理地址空间是可用的,很难说,所有的系统进程,内核和你的其他进程将吃掉。 假设这些总和不超过1Gb,那么您仍然可以使用3Gb。

可能发生的是碎片化:

0Gb 3Gb

---------------------〜---------------------------- --------

|东西| 堆,1.2Gb分配的东西| 免费堆| 堆栈|

---------------------〜---------------------------- --------

然后你释放这个大对象,但是在其他的内存之间已经被分配了,留给你这个:

0Gb 3Gb

---------------------〜---------------------------- --------------

|东西| 堆,1.2Gb free | small object(s)| 免费堆| 堆栈|

---------------------〜---------------------------- --------------

如果你现在尝试分配一个更大的对象,它将不能适应免费的1.2Gb空间。也可能不适合free heap空间,因为这可能没有足够的空间。

如果大量使用堆栈,堆栈可能会增长并占用空间,否则可能会用于堆空间 – 尽管默认情况下大多数发行版将堆栈限制为8-10Mb。

使用malloc / realloc不会帮助这个。 但是,如果您知道所需的最大对象的大小,则可以在启动时保留那么多。 这件作品永远不会被free'd / deleted,它应该被重用。 这是否会让你陷入其他困境,这很难说清楚 – 其他物体可用的空间会变小。

非常感谢回应。 进一步的调查表明,碎片确实是问题。 当第一个请求到达时,保留我们所需要的最大缓冲区,并且为后续请求保留该缓冲区似乎正常工作。

您的地址空间不足,因此没有足够大的单个块来满足您的分配。

解决办法是运行一个64位的 *** 作系统 – 毕竟,这是21世纪!

当然,你将需要重新测试你的应用程序的64位兼容性(和重新编译等),但从长远来看是有道理的。 现在的4G服务器并不是很多, 一个相当温和的有16-32G。

总结

以上是内存溢出为你收集整理的linux new / delete,malloc / free大内存块全部内容,希望文章能够帮你解决linux new / delete,malloc / free大内存块所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1278026.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-09
下一篇2022-06-09

发表评论

登录后才能评论

评论列表(0条)

    保存