java中堆和棧的區別

java中堆和棧的區別自然是面試中的常見問題,下面幾點就是其具體的區別

1.各司其職

最主要的區別就是棧內存用來存儲局部變量和方法調用。 
而堆內存用來存儲Java中的對象。無論是成員變量,局部變量,還是類變量,它們指向的對象都存儲在堆內存中。

2.獨有還是共享

棧內存歸屬於單個線程,每個線程都會有一個棧內存,其存儲的變量只能在其所屬線程中可見,即棧內存可以理解成線程的私有內存。 
而堆內存中的對象對所有線程可見。堆內存中的對象可以被所有線程訪問。

3.異常錯誤

如果棧內存沒有可用的空間存儲方法調用和局部變量,JVM會拋出java.lang.StackOverFlowError。 
而如果是堆內存沒有可用的空間存儲生成的對象,JVM會拋出java.lang.OutOfMemoryError。

4.空間大小

棧的內存要遠遠小於堆內存,如果你使用遞歸的話,那麼你的棧很快就會充滿。如果遞歸沒有及時跳出,很可能發生StackOverFlowError問題。 
你可以通過-Xss選項設置棧內存的大小。-Xms選項可以設置堆的開始時的大小,-Xmx選項可以設置堆的最大值。

這就是Java中堆和棧的區別。理解好這個問題的話,可以對你解決開發中的問題,分析堆內存和棧內存使用,甚至性能調優都有幫助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章