堆、栈和数据存储单元的大小

Posted

技术标签:

【中文标题】堆、栈和数据存储单元的大小【英文标题】:Size of Heap, Stack and Data Memory Units 【发布时间】:2013-12-02 07:43:44 【问题描述】:

这个问题有几个部分。

根据网上可用的大部分资源以及教科书,堆内存和栈内存的增长方向相反。

    堆和堆栈实际上是否总是以相反的方向彼此增长,尤其是当操作系统为堆内存分配额外的内存时?

    请考虑,最初在程序中,仅发生堆分配并且使用最少的堆栈内存。因此,堆将覆盖为堆栈和堆分配的几乎整个组合内存。之后,Stack 开始增长。是否会抛出错误或者是否会为 Stack 分配新的内存位置以增长到其最大限制(最大限制 = “ulimit -s”命令显示的限制)?如果可以分配新的位置,那不违反Stack中地址总是按顺序分配的条件吗?

    存储在数据部分的已初始化和未初始化变量是否对内存使用有任何预定义限制?

【问题讨论】:

只能针对特定的操作系统和处理器架构回答这些问题。操作系统和硬件完全决定了内存管理策略。 ***.com/questions/2067126/… 【参考方案1】:

答案:

Do Heap and Stack actually always grow in opposite directions towards each other,
especially when extra memory is allocated by the OS for Heap memory?  

堆和栈是实现细节,语言规范不要求。它们生长的方向不一定是相互的;他们可以随心所欲地成长。

Consider that initially in the program,  
only heap allocations take place and minimal Stack memory is used.  
Hence, Heap will cover almost entire combined memory allocated  
for Stack and heap. Afterwards, Stack starts to grow.  
Will an error be thrown or will new memory location be allotted  
for Stack to grow to its maximum limit
(maximum limit = limit shown by "ulimit -s" command)?  
If new location can be allotted, then doesn't it violate the condition  
that in Stack addresses are always assigned in order?  

如果您的堆和堆栈相互靠近,则可能会发生覆盖。只有当您的内存分配器检查空间不足或您有一个检查运行时堆栈分配的实用程序时,您才会收到溢出通知。请记住,并非所有平台都是 Linux 或 Windows PC;许多是受限的嵌入式系统。

Is there any pre-defined limit on the memory usage  
by initialized and uninitialized variables  
stored in Data section?  

是的,变量必须有内存。操作系统可以将变量调出到外部设备。变量可能不是变量而是硬件寄存器。同样,这都是特定于平台的。语言标准强加的规则是变量必须是可寻址的,并且静态或自动变量必须具有唯一的地址(单一定义规则,ODR)。

【讨论】:

以上是关于堆、栈和数据存储单元的大小的主要内容,如果未能解决你的问题,请参考以下文章

浅谈Java中的栈和堆

栈和堆

数据结构(栈和队列)

数据结构 3 栈和队列

JVM栈和堆的详解

垃圾回收策略学习总结