关于java GC和内存管理我几乎没有问题。
在java中,我们通过xmx和xms参数定义进程内存上限和下限。使用这些参数,JVM分配年轻的旧的和perm空间。那么如果创建了新的线程,那么堆栈内存会从哪个内存分配给线程?是来自烫发空间还是其他任何空间?
类的静态变量是否分配给年轻,旧或烫发空间? (我猜烫发?)
XmX参数是否会限制年轻+老一代或年轻+老+烫发或年轻+老+烫发+堆栈大小?
谢谢
答案 0 :(得分:4)
基本上,堆栈内存来自堆栈区域,它独立于堆区域和perm 区域。
静态变量在堆中分配,但字符串和数字常量除外。
-Xmx
参数仅限制堆的年轻+旧部分,因为perm区域不是它的一部分。
堆栈区域大小由-Xss
标志设置,堆区域大小由-Xmx
标志设置,烫发区域大小由-XX:MaxPermSize
设置。
如果您想深入了解JVM内部内存管理,我建议使用blog entry。
答案 1 :(得分:0)
线程堆栈空间由另一个选项 -Xss 控制。 Here是一个可以帮助您解决此特定主题的参考。
答案 2 :(得分:0)
你可以使用'ulimit -a'来查看进程的堆栈限制。我认为线程堆栈是从这个资源中获取的。我想知道当堆中有足够的空间用于线程时JVM是否会发出垃圾收集,但是没有足够的空间用于它们的堆栈。