堆内存和栈内存

前言

在项目里边由于要专门开辟非常大的空间,因此最近又特意回顾了下堆内存和栈内存。

正文

首先先简单回顾一下什么是堆什么是栈
:堆分为全局堆和局部堆。全局堆是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统堆进程初始化的时候分配,在运行过程中也可以向系统索要额外的堆,但是用完了要及时free或者delete掉,否则会造成内存泄漏。堆是所有线程共有的空间。
:栈是线程独有的,保存其运行状态和局部自动变量的。栈在县城开始的时候初始化,每个线程的栈是互相独立的,每个函数都有其自己的栈空间,栈被用来在函数之间传递参数。操作系统在切换线程的时候会自动切换栈。栈空间不需要在高级语言里面显示分配和释放。

堆和栈的区别

  • 分配方式的不同

简单来说,栈是由编译器自动分配释放,存放函数的参数值、局部变量的值等。操作方式类似于数据结构中的栈,栈内存处于一段连续的地址区域,并向低地址扩展;
而堆一般由程序员分配释放,如果没有手动释放的话,程序结束时可能由操作系统自动回收,但并不是所有操作系统都会自动回收内存,因此一定要手动释放已分配内存,同时,栈内存的空间是不连续的。

  • 空间大小的不同

在Windows环境下,每个栈内存空间一般是确定的常数—2M,超出了限制,会提示stack overflow错误,在Linux环境下,每个栈的默认空间大小为10M,可以通过ulimit -s查看并修改默认栈大小;
堆内存总共占操作系统的80%的内存空间,分为全局堆和局部堆。


标题:堆内存和栈内存
作者:staymeloo7
联系方式:staycoolsun@gmail.com

    评论
    0 评论
avatar

取消