分配给线程的堆栈内存来自哪里?

时间:2010-09-25 17:03:17

标签: memory-management garbage-collection jvm heap

关于java GC和内存管理我几乎没有问题。

在java中,我们通过xmx和xms参数定义进程内存上限和下限。使用这些参数,JVM分配年轻的旧的和perm空间。那么如果创建了新的线程,那么堆栈内存会从哪个内存分配给线程?是来自烫发空间还是其他任何空间?

类的静态变量是否分配给年轻,旧或烫发空间? (我猜烫发?)

XmX参数是否会限制年轻+老一代或年轻+老+烫发或年轻+老+烫发+堆栈大小?

谢谢

3 个答案:

答案 0 :(得分:4)

基本上,堆栈内存来自堆栈区域,它独立于堆区域和perm 区域。

静态变量在堆中分配,但字符串和数字常量除外。

-Xmx参数仅限制堆的年轻+旧部分,因为perm区域不是它的一部分。

堆栈区域大小由-Xss标志设置,堆区域大小由-Xmx标志设置,烫发区域大小由-XX:MaxPermSize设置。

如果您想深入了解JVM内部内存管理,我建议使用blog entry

答案 1 :(得分:0)

线程堆栈空间由另一个选项 -Xss 控制。 Here是一个可以帮助您解决此特定主题的参考。

答案 2 :(得分:0)

在solaris上

你可以使用'ulimit -a'来查看进程的堆栈限制。我认为线程堆栈是从这个资源中获取的。我想知道当堆中有足够的空间用于线程时JVM是否会发出垃圾收集,但是没有足够的空间用于它们的堆栈。