关于Stack(堆栈/栈)和Heap(堆)如何被管理并存储在RAM中

69 阅读2分钟

如何理解Stack和Heap

  1. Stack和Heap在中文上翻译

    • Stack:所有文字载体上看到的中文词汇堆栈都是指Stack(以下内容对Stack统一翻译为堆栈
    • Heap:堆
  2. 这两个都是数据结构(在算法题中经常让你用对应的编程语言实现堆栈和堆),计算机领域把堆栈和堆的实现规则应用在寄存器设计、RAM存储空间、操作系统虚拟化内存、编程语言对于数据结构的表达中。

  3. 当程序运行时,程序中的相应数据会通过编程语言的虚拟机管理(或由操作系统管理),形成堆栈和堆,并加载存储到RAM中(RAM本身是一块普通的内存,它自己并不区分栈和堆,是由编程语言运行程序所需的软件和硬件环境来管理堆栈和堆在程序执行时对内存的不同使用方式)。

C和Java对于堆栈和堆的内存管理

  • C语言

    • 堆栈:堆栈的内存自动交给操作系统管理分配。
    • 堆:通过使用 malloc() 来动态分配堆内存,使用 free() 来释放堆内存。
  • Java

    • JVM自动管理,对象引用存储在堆栈中,对象存储在堆中。

堆栈和堆会导致的内存管理问题

  • 堆栈溢出(堆栈的管理不当导致)
    • 在程序执行期间使用了太多的堆栈内存会导致堆栈溢出。
    • 比如在写代码的时候不断使用递归调用、或者多次嵌套函数调用,就会导致程序执行时堆栈溢出。
  • 内存泄露(堆的管理不当导致)
    • 在程序执行期间,因为动态内存不断被分配,不释放内存,导致内存耗尽,然后操作系统无法分配更多的内存给该程序,从而使程序无法继续执行下去导致崩溃。
    • 比如C程序的代码中在变量的内存分配、函数的调用中使用了malloc函数动态分配内存,后面没有用free函数释放内存,就会导致内存泄露。