Java是一門一直都很活躍在我們生活中的一門開發語言了,不管是多少年過去,也不管是有多少的開發語言的崛起都不能夠代替的了java在程序員心中的地位,java涉及的范圍是非常廣泛的,而且在技術上也是比較成熟的,那么java開發中堆和棧有什么區別呢?
堆和棧的區別:
各司其職,主要的區別就是棧內存用來存儲局部變量和方法調用。而堆內存用來存儲Java中的對象。無論是成員變量,局部變量,還是類變量,它們指向的對象都存儲在堆內存中。
獨有還是共享,棧內存歸屬于單個線程,每個線程都會有一個棧內存,其存儲的變量只能在其所屬線程中可見,即棧內存可以理解成線程的私有內存。而堆內存中的對象對所有線程可見。堆內存中的對象可以被所有線程訪問。
異常錯誤:如果棧內存沒有可用的空間存儲方法調用和局部變量,JVM會拋出而如果是堆內存沒有可用的空間存儲生成的對象,JVM會拋出java.lang.OutOfMemoryError。
空間大小:棧的內存要遠遠小于堆內存,如果你使用遞歸的話,那么你的棧很快就會充滿。如果遞歸沒有及時跳出,很可能發生StackOverFlowError問題。你可以通過-Xss選項設置棧內存的大小。-Xms選項可以設置堆的開始時的大小,-Xmx選項可以設置堆的值。
具體而言,棧內存主要用來存放基本數據類型與引用變量,棧內存的管理是通過壓棧和彈棧操作來完成的,以棧幀為基本單位來管理程序的調用關系,每當有函數調用時,都會通過壓棧方式創建新的棧幀,每當函數調用結束后都會通過彈棧的方式釋放棧幀。
堆內存用來存放運行時創建的對象,一般來講,通過new關鍵字創建出來的對象都存放在堆內存中,由于JVM是基于堆棧的虛擬機,而每個java程序都運行在一個單獨的jvm實列上,每一個實列對應一個堆,一個java程序內的多個線程也就運行在同一個jvm實列上,因此這些線程之間會共享堆內存,鑒于此,多線程在訪問堆中的數據時需要對數據進行同步,
在C++中,堆內存的管理都是由開發人員來負責的,也就是說,開發人員在堆中申請的內存,當不在使用時,必須由開發人員完成堆內存的釋放工作,而在java語言中,這個內存釋放的工作由垃圾回收器來負責執行,開發人員只需要申請所需的堆空間而不需要考慮釋放的問題。
在堆中產生了一個數組或對象后,還可以在棧中定義一個特殊的變量,讓棧中這個變量的取值等于數組或對象在堆內存中的首地址,棧中的這個變量就成了數組或對象的引用變量,引用變量就相當于是為數組或對象起的一個名稱,以后就可以在程序中使用棧中的引用變量來訪問堆中的數組或對象,這就是java中引用的用法。
關于java開發中的堆和棧有什么區別粵嵌科技已經和大家說了,如果說你想要了解或者是學習更多關于java的知識的話那么粵嵌科技歡迎大家來我們公司的java培訓班進行實地考察,也可以點擊我們文章下面的獲取試聽資格按鈕來獲取我們的java課程免費試聽資格,在試聽中可以更加深入的了解粵嵌科技。