一. 从数据结构角度来说:栈stack和队列queue
Stack的特点,LIFO (Last in first out)。
Queue的特点,FIFO (First in first out)。
二. 从内存区域角度来说:栈stack和堆heap
系统一般在内存中划分出两种不同的内存空间,stack和heap。
1. stack是有结构的,每个区块按照一定次序存放,可以明确知道每个区块的大小。
heap是没有结构的,数据可以任意存放。
因此,stack的寻址速度要快于heap。
2. 每个线程分配一个stack,每个进程分配一个heap,也就是说,stack是线程独占的,heap是线程共用的。
stack创建的时候,大小是确定的,数据超过这个大小,就发生stack overflow错误。
heap大小是不确定的,需要的话可以不断增加。
如果stack内存没有可用的空间存储方法调用和局部变量,JVM会抛出java.lang.StackOverFlowError。
如果heap内存没有可用的空间存储生成的对象,JVM会抛出java.lang.OutOfMemoryError。
3. 使用-Xss设置内存中stack的大小,使用-Xms设置min-heap内存,使用-Xmx设置max-heap内存。
4. 数据存放的规则是:只要是局部的、占用空间确定的数据,一般都存放在stack里面,否则就放在heap里面。