我知道每个线程都有自己的stack
。基元类型和引用保留在堆栈上,没有对象保留在堆栈上。
我的问题是:
Xms
和-Xmx
)发布于 2013-11-17 21:08:00
堆栈可以增长多少?
您可以使用名为ss
的VM选项来调整最大堆栈大小。VM选项通常使用-X{ option }传递。因此,您可以使用java -Xss1M
将堆栈大小的最大值设置为1M。
每个线程至少有一个堆栈。一些Java虚拟机将Java堆栈(Java方法调用)和本机堆栈(VM中的本机方法调用)放在一个堆栈中,并使用称为M2nFrame的“托管到本机框架”执行堆栈展开。一些JVM分别保留两个堆栈。在大多数情况下,Xss
设置Java Stack的大小。
对于许多JVM,它们在不同的平台上设置不同的堆栈大小默认值。
我们能限制这种增长吗?
当发生方法调用时,将在该线程的堆栈上创建一个新的堆栈框架。堆栈将包含局部变量、参数、返回地址等。在Java中,您永远不能将对象放入堆栈,只能将对象引用存储在堆栈中。因为数组在Java中也是一个对象,所以数组也不存储在堆栈上。因此,如果您通过将本地原始变量和参数分组为对象来减少它们的数量,则可以减少堆栈上的空间。实际上,我们不能显式地将对象放在Java堆栈上的事实有时会影响性能(缓存未命中)。
堆栈是否有缺省的最小值或缺省的最大值?
正如我之前所说的,不同的VM是不同的,并且可能会随着版本的不同而变化。参见here。
堆栈上的垃圾收集是如何工作的?
Java中的垃圾回收是一个热门话题。垃圾收集旨在收集堆中无法访问的对象。因此,这需要一个“可达”的定义。堆栈上的所有内容都构成了GC中根集引用的一部分。从每个线程的每个堆栈可以访问的所有内容都应该被认为是活动的。还有一些其他的根集引用,比如Thread对象和一些类对象。
这只是一个非常模糊的堆栈在GC上的用法。目前,大多数JVM都在使用分代GC。This article对Java作了简要介绍。最近,我看到a very good article在谈论.NET平台上的GC。Oracle JVM上的GC非常相似,所以我认为这也可能对您有所帮助。
发布于 2013-11-17 19:50:34
正如您所说,局部变量和引用存储在堆栈中。当一个方法返回时,堆栈指针被简单地移回到方法开始之前的位置,也就是说,所有的本地数据都被“从堆栈中移除”。因此,堆栈上不需要垃圾收集,这只在堆中发生。
要回答您的特定问题:
对于windows,32位的默认堆栈大小为320k,64位的默认堆栈大小为1024k,请参见this link.
https://stackoverflow.com/questions/20030120
复制相似问题