2010-09-25 66 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是否会发出垃圾回收,但是堆栈空间不足。