2 回答

TA貢獻41條經(jīng)驗 獲得超61個贊
最主要的區(qū)別就是棧內(nèi)存用來存儲局部變量和方法調(diào)用吧。
堆內(nèi)存用來存儲Java中的對象。無論是成員變量,局部變量,還是類變量,它們指向的對象都存儲在堆內(nèi)存中。
獨有還是共享
棧內(nèi)存歸屬于單個線程,每個線程都會有一個棧內(nèi)存,其存儲的變量只能在其所屬線程中可見,即棧內(nèi)存可以理解成線程的私有內(nèi)存。
而堆內(nèi)存中的對象對所有線程可見。堆內(nèi)存中的對象可以被所有線程訪問。
異常錯誤
如果棧內(nèi)存沒有可用的空間存儲方法調(diào)用和局部變量,JVM會拋出java.lang.StackOverFlowError。
而如果是堆內(nèi)存沒有可用的空間存儲生成的對象,JVM會拋出java.lang.OutOfMemoryError。
空間大小
棧的內(nèi)存要遠遠小于堆內(nèi)存,如果你使用遞歸的話,那么你的棧很快就會充滿。如果遞歸沒有及時跳出,很可能發(fā)生StackOverFlowError問題。
你可以通過-Xss選項設(shè)置棧內(nèi)存的大小。-Xms選項可以設(shè)置堆的開始時的大小,-Xmx選項可以設(shè)置堆的最大值。
這就是Java中堆和棧的區(qū)別。理解好這個問題的話,可以對你解決開發(fā)中的問題,分析堆內(nèi)存和棧內(nèi)存使用,甚至性能調(diào)優(yōu)都有幫助。
添加回答
舉報