堆和栈的区别

栈和堆的区别

  • 申请方式不同:栈是由系统自动分配的,堆是程序员自己申请的(实例化一个对象)
  • 申请大小不同:栈申请获得的空间较小,堆获得的空间较大
  • 申请效率不同:栈由系统自动分配,速度较快,堆分配速度较慢
  • 底层不同,栈是连续空间,堆是分散空间
  • 存储内容不同:栈在函数调用时,在声明一个函数或者声明一个局部变量时会把这个函数放入栈中,函数的各种参数入栈,然后函数结束这个函数就从栈中pop掉,堆一般是头部用一个字节存放堆的大小,存放静态变量,堆中具体内容是人为安排,长时间不用会被gc掉。

内存泄露:堆内存中内存申请了但是没有释放,每次执行就会申请内存以至于可用内存减少。

函数调用时候栈是怎么push和pop的

先讲栈是怎么push的,在A函数调用B的时候,函数的栈会向高地址扩张,会把函数调用过程中的各种信息(参数,返回地址,本地变量等)放入栈中,并且会有栈顶指针和栈底指针分别指向B的栈顶和B的栈底,然后在运行完pop的时候会根据返回地址把原来指向B栈底的指针指向返回地址(A的栈底),栈顶B指向新的A的栈顶(就是运行完的函数的B的栈底)。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!