2010-09-25 101 views
3

我有幾個關於java GC和內存管理的問題。分配給線程的堆棧內存來自哪裏?

在java中,我們通過xmx和xms參數定義進程內存上限和下限。使用這些參數,JVM分配年輕的舊的和燙髮的空間。因此,如果創建新線程,那麼從哪個內存堆棧中將內存分配給線程?是來自燙髮區還是其他空間?

還有類的靜態變量分配給哪些空間年輕人,老人或燙髮空間? (我猜燙髮了嗎?)

XmX參數限制青少年+老年人OR年輕+老+燙髮族OR年輕+老+燙髮+堆疊尺寸?

由於

回答

4

基本上,堆棧內存來自堆棧區域,它與堆區和perm 區域無關。

靜態變量分配在堆中,除了字符串和數字常量。

-Xmx參數只限於堆的年輕+舊部分,因爲燙髮區不是它的一部分。

堆棧區域大小由-Xss標誌設置,堆區域大小由-Xmx標誌設置,並且燙髮區域大小由-XX:MaxPermSize設置。

如果你想深入JVM內存管理,我推薦這個blog entry

0

線程堆棧空間被另一選項-Xss控制。 Here是一個可以幫助你瞭解這個特定主題的參考。

+0

我知道-Xss標誌。我的問題是:使用-Xss選項分配給線程的內存從哪裏來?或者你可以回答這個問題:XmX參數限制青年+老年人或青年+老年+燙髮族或年輕+老+燙髮+堆疊大小?如果它不包括堆棧大小,那麼從哪裏分配堆棧空間? – Ashish 2010-09-26 02:43:28

0

在solaris上,您可以使用'ulimit -a'來查看進程的堆棧限制。我認爲線程堆棧取自這個資源。我想知道當堆中有足夠的空間用於線程時,JVM是否會發出垃圾回收,但是堆棧空間不足。