2015-11-19 97 views
-1

正如我所讀,一個JVM有兩個內存空間(在Java 8中),堆和元空間。在JVM中,堆棧內存將佔用什麼內存空間?

我們可以使用-Xss標誌來指定堆棧內存(正如我讀過的,在java 8中默認爲1MB)。如果Java程序創建數千個線程,堆棧的內存可能非常重要。

那麼,在線程堆棧所在的內存空間(堆或者元空間)中呢?

+0

堆棧大小爲_per thread_;因此,這個1MB只會被每個線程吃掉,並且沒有兩個線程共享這個空間。在那之後,好吧,這是2015年,所以不要求分頁的操作系統已經死亡,最壞的情況是死亡。 – fge

回答

-1

Java虛擬機內存由區域組成。存儲變量和方法的堆棧區域以及存儲其他所有內容的堆空間區域。 Java堆空間再次在不同地區稱爲世代,並且存儲對象的位置取決於對象的存在時間。

JVM中只有一個堆,所有線程都共享它。 堆只包含對象。沒有辦法在堆上放置孤立的原始類型或對象引用 - 這些東西必須是對象的一部分。數組駐留在堆上,包括原始類型的數組,但在Java中,數組也是對象。

除了Java堆棧和堆,其他地方的數據可能駐留在JVM中的方法區域,其中包含程序使用的所有類(或 靜態)變量。方法區域類似於 堆棧,因爲它只包含基元類型和對象 引用。不過,與堆棧不同的是,方法區域中的類變量由所有線程共享。

JVM中只有一個堆,所有線程共享它。有關詳細信息,請繼續閱讀here

+0

我不介意downvote,但我絕對不介意downvote的原因。如果我犯了一個錯誤,告訴我原因,以免將來重複。 – Raf

+0

你的答案不清楚,不直接回答我的問題。你說有一個堆棧區域,但谷歌搜索'Java堆棧區域'沒有給出任何結果證明它。而且,方法代碼並不駐留在堆棧上,而是駐留在元空間中。另外,每個線程都有它自己的堆棧內存,但是你沒有指定它們是否在你提到的同一個「區域」中。你也用粗體文字(暗示它回答我的具體問題)提到所有線程共享相同的堆。但是,這並不能回答我的問題。 (我的問題是,每個線程的堆棧位於哪個區域) –

+0

感謝您的反饋。是的,我承認java堆棧區域無效,它應該是java堆棧內存,區域只適用於堆。我在腦海中寫下了java 7的答案。 – Raf