堆内存与栈内存

zmisgod 发布于 2019-3-25 14:06:38 阅读 107 评论 0

什么是堆内存(heap)

一般由程序员分配和释放,如果没有手动释放,在程序结束时可能由操作系统自动释放。

什么是栈内存(stack)

由编译器自动分配和释放,存放函数的参数、局部变量、临时变量、函数返回地址等,栈满会导致Stack Overflow。

主流语言中的栈内存与堆内存的分配

C++

局部变量分配在栈上,函数如果退出,局部变量就立刻被销毁

全局变量分配在堆上,需要手动释放

JAVA

几乎所有都是分配在堆上,由new初始化,GC回收内存

未进行逃逸分析的堆空间远大于进行逃逸分析后使用的栈空间,堆的空间大于栈

栈上分配可以提升代码性能,降低在多线程情况下的锁使用,但是会受限于其空间的大小,导致StackOverflow

GO

不需要关心,由编译器自行决定放在堆还是栈上,编译器会做逃逸分析,当发现变量的作用域没有跑出函数范围,就在栈上,反之分配在堆上

便于程序员关注程序功能而不是关注内存的使用限制