栈和堆的区别

  栈和堆有啥区别?这是一个很容易混淆的问题。首先从数据结构层面来看,堆是完全二叉树,栈是后进先出的线性表。从java虚拟机层面看,这两者都是内存中的运行时数据区域,具体区别如下:

1、栈(stack)是线程私有的,随某一线程出生和死亡;堆(heap)是所有线程共享的,随虚拟机启动出生、关闭死亡。

2、栈通过栈帧来存放方法执行时信息,包括局部变量(基本数据类型和对象引用)、方法出口等,方法调用时入栈,方法结束时出栈并回收内存;堆存放对象实例,栈里的对象引用指向堆里的对象实例,对象引用出栈后该对象实例仍然存活,可以被其他线程使用,但最终会被堆通过垃圾回收杀死回收内存。

3、堆是虚拟机中分配出来最大内存的运行时数据区域,栈没得比。

4、如果线程申请的栈深度大于虚拟机所允许的深度,将报StackOverflowError;如果实例分配超过了堆中剩余空间,会报内存溢出(OutOfMemoryError)。

5、题外话,内存溢出很好理解,内存泄漏(memory leak)是某块内存申请后没有回收,比如某个方法打开文件后忘了关闭,这就是内存泄漏,如果多次调用该方法那么会出现什么状况呢?有再多内存都会被耗光,造成内存溢出。

posted on 2017-03-10 22:19  不想下火车的人  阅读(232)  评论(0编辑  收藏  举报

导航