1. 程式人生 > >java中heap和stack的區別

java中heap和stack的區別

1、java堆

     java堆是用於儲存java物件的記憶體區域,堆的大小在JVM啟動時就一次向作業系統申請完成,通過-Xmx和-Xms兩個選項來控制大小,Xmx表示堆的最大大小,Xms表示初始大小。一旦分配完成,堆的大小就將固定,不能在記憶體不夠時再向作業系統重新申請,同時當記憶體空閒時也不能將多餘的空間交還給作業系統,

在java堆中記憶體空間的管理由JVM控制,物件建立由JAVA應用程式控制,但是物件所佔的空間釋放由管理堆記憶體的垃圾收集器完成,根據垃圾收集(GC)演算法的不同,記憶體的回收方式和時機也不同,

 2、java 棧

java棧總是和執行緒關聯在一起,每當建立一個執行緒時,JVM就會為這個執行緒建立一個對應的java棧,在這個java棧中又會含有多個棧
,這些棧是與每個方法關聯起來的,每執行一個方法就建立一個棧,每個棧會含有一些內部變數(在方法內定義的變數)、操作棧和方法返回值等資訊。
   每當一個方法執行完畢時,這個棧禎就會彈出棧幀的元素作為這個方法的返回值,並清除這個棧幀,java棧的棧頂的棧幀就是當前正在執行的活動棧,也就是當前正在執行的方法,PC暫存器也會執行這個地址,只有這個活動的棧幀的本地變數可以被操作棧使用,當在這個棧幀中呼叫另一個方法時,與之對應的一個新的棧幀又被建立,這個新建立的棧幀又被放到java棧的頂部,變為當前活動的棧幀,同樣現在只有這個棧幀的本地變數才能被使用,當在這個棧幀中所有指令執行完成時這個棧幀移出java棧,剛才的那個棧幀又變為活動棧幀,前面的棧幀的返回值又變為這個棧幀的操作棧中的一個運算元,如果前面的棧幀沒有返回值,那麼當前的棧幀的操作棧的運算元沒有變化。
 由於java棧是與java執行緒對應起來的,這個資料不是執行緒共享的,所以我們不用關係它的資料一致性問題,也不會存在同步鎖的問題