一. 從數據結構角度來說:棧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裏面。