我們都知道JAVA是運行在JVM虛擬機上的,而虛擬機又是基於堆棧的,每個java程序運行時都會在一個獨立的JVM虛擬機實例上運行(包括多線程)。
棧:
存放基本數據類型對象、引用;
當程序運行超出其作用域後自動釋放空間;
存放在棧中的內容讀取速度非常快;(C++一般存放在棧中,所以速度比較快);
棧中的數據是可以共享的:例如:我們同時創建 int a=1;int b=1; 首先會在棧中創建引用‘a’以及整數 1 ,再創建引用'b',因爲棧中已經存在整數 1 了,所以引用'b'會直接指向已經存在的 整數 1,如果再設置 b = 2;此時棧中沒有發現整數2則會立刻創建儲存空間將2存放進去,這也就說通了爲什麼基本類型是可以用'=='來判斷是否相等的,而其他類型不可以。
堆:
存放new出來的實體、數組,實體及數組的引用存放在棧中;(存儲的成本比較大,速度慢)
當堆中的實體或數組引用無效後,由GC(垃圾回收機制)自動回收(不可控);
舉例代碼:
public static void main(String[] args) {
int i = 100; //棧
int k = 100; //棧
mainTest entity1 = new mainTest();//堆
mainTest entity2 = new mainTest();//堆
System.out.println(i==k);
System.out.println(entity1==entity2);
}
堆棧分佈: