首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >默认的堆栈大小是多少,它可以增长吗,它如何与垃圾收集一起工作?

默认的堆栈大小是多少,它可以增长吗,它如何与垃圾收集一起工作?
EN

Stack Overflow用户
提问于 2013-11-17 19:30:57
回答 2查看 112.9K关注 0票数 85

我知道每个线程都有自己的stack。基元类型和引用保留在堆栈上,没有对象保留在堆栈上。

我的问题是:

  • 堆栈可以增长多少?(与参数-Xms和-Xmx)
  • Can一样,我们限制其增长?
  • 堆栈是否有默认的最小值和最大值?
  • 垃圾收集在堆栈上是如何工作的?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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非常相似,所以我认为这也可能对您有所帮助。

票数 97
EN

Stack Overflow用户

发布于 2013-11-17 19:50:34

正如您所说,局部变量和引用存储在堆栈中。当一个方法返回时,堆栈指针被简单地移回到方法开始之前的位置,也就是说,所有的本地数据都被“从堆栈中移除”。因此,堆栈上不需要垃圾收集,这只在堆中发生。

要回答您的特定问题:

  • 有关如何增加堆栈大小的信息,请参见this question
  • 您可以通过以下方式限制堆栈的增长:
    • 将多个局部变量分组到一个对象中:该对象将存储在堆中,并且只有引用存储在堆栈中
    • 限制嵌套函数调用的数量(通常不使用many

对于windows,32位的默认堆栈大小为320k,64位的默认堆栈大小为1024k,请参见this link.

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20030120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档