堆栈可以增长多少?
您可以使用名为ss的VM选项来调整最大堆栈大小. VM选项通常使用-X {option}传递.因此,您可以使用java -Xss1M将堆栈大小的最大值设置为1M.
每个线程至少有一个堆栈.一些Java虚拟机(JVM)将Java堆栈(Java方法调用)和本机堆栈(VM中的本机方法调用)放入一个堆栈中,并使用Managed to Native Frame(称为M2NFrame)执行堆栈展开.一些JVM分别保留两个堆栈.在大多数情况下,Xss设置Java Stack的大小.
对于许多JVM,它们在不同平台上为堆栈大小设置了不同的默认值.
我们可以限制这种增长吗?
发生方法调用时,将在该线程的堆栈上创建新的堆栈帧.堆栈将包含局部变量,参数,返回地址等.在java中,您永远不能将对象放在堆栈上,只有对象引用可以存储在堆栈中.由于数组也是java中的对象,因此数组也不存储在堆栈中.因此,如果通过将参数分组为对象来减少本地原始变量,参数的数量,则可以减少堆栈上的空间.实际上,我们不能将对象放在java堆栈上的事实会影响性能一段时间(缓存未命中).
堆栈是否具有某些默认最小值或默认最大值?
正如我之前所说,不同的VM是不同的,并且可能会更改版本.见here.
垃圾收集如何在堆栈上工作?
Java中的垃圾收集是一个热门话题.垃圾收集旨在收集堆中无法访问的对象.所以这需要’可达’的定义.堆栈中的所有内容构成GC中根集引用的一部分.每个线程的每个堆栈都可以访问的所有东西都应该被认为是实时的.还有一些其他根集引用,如Thread对象和一些类对象.
这只是在GC上使用堆栈非常模糊.目前大多数JVM都使用世代GC. This article简要介绍了Java GC.最近我读了a very good article在.net上谈论GC. oracle jvm上的GC非常相似,所以我认为这也可以帮到你.