我知道每个线程都有自己的线程stack
。基本类型和引用保留在堆栈上,并且没有对象保留在堆栈上。
我的问题是:
- 堆栈可以增长多少?(如参数-
Xms
和-一样Xmx
) - 我们可以限制其增长吗?
- 堆栈是否具有默认的最小值和最大值?
- 垃圾收集如何在堆栈上工作?
我知道每个线程都有自己的线程stack
。基本类型和引用保留在堆栈上,并且没有对象保留在堆栈上。
我的问题是:
Xms
和-一样Xmx
)Answers:
堆栈可以增长多少?
您可以使用名为VM的选项ss
来调整最大堆栈大小。VM选项通常使用-X {option}传递。因此,您可以用于java -Xss1M
将最大堆栈大小设置为1M。
每个线程至少具有一个堆栈。一些Java虚拟机(JVM)将Java堆栈(Java方法调用)和本机堆栈(VM中的本机方法调用)放入一个堆栈中,并使用称为M2NFrame的托管到本机框架执行堆栈退卷。一些JVM分别保留两个堆栈。Xss
在大多数情况下,设置Java堆栈的大小。
对于许多JVM,它们在不同平台上为堆栈大小放置了不同的默认值。
我们可以限制这种增长吗?
发生方法调用时,将在该线程的堆栈上创建一个新的堆栈框架。堆栈将包含局部变量,参数,返回地址等。在Java中,您永远不能将对象放在堆栈上,只有对象引用可以存储在堆栈上。由于array也是Java中的对象,因此数组也不存储在堆栈中。因此,如果通过将局部基本变量,参数分组为对象来减少它们的数量,则可以减少堆栈上的空间。实际上,我们无法在Java堆栈上显式放置对象这一事实会影响性能一段时间(缓存未命中)。
堆栈有一些默认最小值或默认最大值吗?
如前所述,不同的虚拟机是不同的,并且可能会随着版本而变化。看这里。
垃圾收集如何在堆栈上工作?
Java中的垃圾回收是一个热门话题。垃圾收集旨在收集堆中无法访问的对象。因此,需要定义“可达”。堆栈上的所有内容均构成GC中根集引用的一部分。每个线程的每个堆栈均可访问的所有内容均应视为活动状态。还有其他一些根集引用,例如Thread对象和一些类对象。
这只是GC上堆栈的一个非常模糊的用法。当前,大多数JVM使用的是世代GC。本文对Java GC进行了简要介绍。最近,我读了一篇非常好的文章,内容涉及.net上的GC。oracle jvm上的GC非常相似,因此我认为这也可能对您有所帮助。
java -Xss 100M -jar testing.jar
引发错误“无效的线程堆栈大小:-Xss错误:无法创建Java虚拟机”。但java -Xss100M -jar testing.jar
效果很好。使用Java“ 1.8.0_112”运行Windows 10 64位。应该修改您的帖子以删除空格吗?