一、堆和栈的基本概念
堆和栈是两种数据结构
堆—先进先出
栈—先进后出
1.java堆
1.1 概念
java堆(java heap)是虚拟机所管理的内存中最大的一块。在虚拟机启动时创建。
此内存区域的唯一目的就是存放对象实例。
2.虚拟机栈
2.1 概念
java虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(stack frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
其中局部变量存放了编译期间可知的各种基本数据类型(boolean、byte、char、short、int、float、double、long)、对象的引用(reference类型)和returnAdress类型(指向一个字节码指令的地址)
二、堆与栈的区别
- 堆内存可以被所有线程共享,栈内存是线程私有的
- 通常栈内存比堆内存小的多
- 堆可以通过虚拟机参数指定大小(-Xmx和-Xms控制)
- 抛出异常不同:
(1) 如果线程请求的栈深度大于虚拟机允许的深度,将抛出StackOverflowError异常。
(2) 如果堆中没有内存完成实例分配,并且堆也无法再扩展时将会抛出OutOfMemoryError异常
[参考文档]《深入了解java虚拟机》