高頻面試題-請聊一下JVM中堆和棧的區別

上一回我們說完了JVM的記憶體結構,將JVM中有哪些元素已經搞清了。

今天就再根據之前的主題接著延伸出一個更容易被面試官問到的題目。

堆和棧的區別!

這次我們就從以下幾個方面說一說有什麼不同之處。

JVM對其的管理方式

虛擬機器棧:執行緒結束後自動釋放記憶體,無須垃圾回收。

堆:需要垃圾回收器進行回收(GC處理)。

執行效率

虛擬機器棧:高; 堆:低。

空間大小

虛擬機器棧:小。

堆:大,之前在記憶體架構篇裡面說過,堆其實佔據了JVM虛擬機器記憶體的一大部分。

記憶體碎片

虛擬機器棧:小,存放的資料少的同時,即使銷燬後也不會留下太多碎片。

堆:大,首先是因為堆空間的大小比虛擬機器棧的空間要大得多,活動量也較之大得多,即使垃圾回收器可以自動回收堆空間,再加上垃圾回收器的回收機制不是實時的,所以就會將記憶體碎片累積起來。

關於垃圾回收器相關知識,後期我會單獨寫一篇文章解釋一下。

分配方式

虛擬機器棧:一部分是靜態分配記憶體,一部分是動態分配記憶體。

堆: 都是動態分配,因為只有在程式執行過程中才會知道物件例項等資料具體需要多少記憶體。

說完了堆與棧的區別呢,接下來面試官可能還要問一下如何設定堆或者棧記憶體的初始值呢?

-Xms

設定堆記憶體初始值。

-Xss

設定虛擬機器棧的記憶體大小。

-Xmx

設定堆可以佔用記憶體的最大值。

加分項來了,順勢補充下面這句話,面試官就能足夠相信你的知識夠紮實了。

注:這個值一般與堆的初始值相同,因為當堆記憶體到達初始值時會進行自動擴容,擴容時就會造成一定的記憶體抖動,很有可能導致程式就此崩掉,或者是效能下降,對程式的穩定性有一定的影響。