2015-11-19 100 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