当前位置: 首页 > 知识库问答 >
问题:

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

曾永新
2023-03-14

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

我的问题是:

  • 一堆可以长多少?(与参数Xms和Xmx类似)

共有2个答案

魏雅惠
2023-03-14

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

要回答您的具体问题:

  • 请参阅有关如何增加堆栈大小的问题。
  • 您可以通过以下方式限制堆栈增长:
    • 将一个对象中的许多局部变量分组:该对象将存储在堆中,并且只有引用存储在堆栈上
    • 限制嵌套函数调用的数量(通常通过不使用递归

金飞
2023-03-14

您可以使用名为ss的VM选项来调整最大堆栈大小。VM选项通常使用-X{option}传递。因此,您可以使用java-Xss1M将堆栈大小的最大值设置为1M。

每个线程至少有一个堆栈。一些Java虚拟机(JVM)将Java堆栈(Java方法调用)和本机堆栈(VM中的本机方法调用)放在一个堆栈中,并使用“托管到本机帧”(即M2nFrame)执行堆栈展开。一些JVM分别保留两个堆栈。在大多数情况下,Xss设置Java堆栈的大小。

对于许多JVM,它们在不同的平台上为堆栈大小设置了不同的默认值。

当方法调用发生时,将在该线程的堆栈上创建新的堆栈帧。堆栈将包含局部变量、参数、返回地址等。在Java中,您永远不能将对象放在堆栈上,只有对象引用可以存储在堆栈上。由于数组在Java中也是一个对象,所以数组也不存储在堆栈上。因此,如果通过将局部基元变量和参数分组到对象中来减少它们的数量,则可以减少堆栈上的空间。实际上,我们不能显式地将对象放在Java堆栈上这一事实在一定程度上影响了性能(缓存未命中)。

正如我之前所说,不同的虚拟机是不同的,并且可能会随着版本的变化而变化。请参见此处。

Java中的垃圾收集是一个热门话题。垃圾收集旨在收集堆中无法访问的对象。因此,这需要一个“可达”的定义堆栈上的所有内容都构成GC中根集引用的一部分。从每个线程的每个堆栈中可以访问的所有内容都应该被视为活动的。还有一些其他根集引用,如线程对象和一些类对象。

这只是在GC上非常模糊地使用堆栈。目前,大多数JVM都使用分代GC。本文简要介绍了Java GC。最近我读了一篇关于GC的很好的文章。NET平台。Oracle JVM上的GC非常相似,因此我认为这也可能对您有所帮助。

 类似资料:
  • 问题内容: 我知道每个线程都有自己的线程。基本类型和引用保留在堆栈上,并且没有对象保留在堆栈上。 我的问题是: 堆栈可以增长多少?(如参数- 和-一样) 我们可以限制其增长吗? 堆栈是否具有默认的最小值和最大值? 垃圾收集如何在堆栈上工作? 问题答案: 堆栈可以增长多少? 您可以使用名为VM的选项来调整最大堆栈大小。VM选项通常使用-X {option}传递。因此,您可以用于将最大堆栈大小设置为1

  • 问题内容: 由于以下原因,我知道如何设置堆栈大小: 如何在Node.js中增加最大调用堆栈大小 但是,默认大小是多少?(即,我如何获得的PHP等效项) 问题答案: 简单的答案是,默认堆栈大小为492 KB(32位)和984KB(64位)。 如soyuka所评论,请尝试以下操作: 要么

  • 问题内容: 我是Go的新手,在C风格的基于堆栈的编程(其中自动变量位于堆栈上,分配的内存位于堆中)与Python风格的基于堆栈的编程(其中唯一存在于堆栈中的东西是对堆上对象的引用/指针。 据我所知,以下两个函数给出的输出相同: 即分配一个新的结构并返回它。 如果用C编写,第一个将对象放到堆上,第二个将对象放到堆栈上。第一个将返回指向堆的指针,第二个将返回指向堆栈的指针,该指针将在函数返回时消失,这

  • 问题内容: 有人可以解释一下G1垃圾收集器的工作原理吗?我还无法在任何地方找到任何全面,易于理解的描述。 谢谢 问题答案: 收集器将堆分成固定大小的区域,并跟踪这些区域中的实时数据。它将一组指针(“记住的集”)保留在区域内和区域外。当认为有必要使用GC时,它将首先收集实时数据较少的区域(因此,“垃圾优先”)。通常,这意味着一步就可以收集整个区域:如果进入一个区域的指针数量为零,则无需对该区域进行标

  • 我一直在使用java(jdk 6 hot spot JVM)进行垃圾收集。我希望社区能帮助我解决一些问题。 我的理解是: 1) 堆被分为 a)年轻一代-Eden和幸存者:新的对象和阵列被创建到年轻一代。次要的垃圾回收机制将在年轻一代中运行。对象,仍然活着,将从伊甸园空间移动到幸存者空间。 b)老一代/终身一代:主要收集将仍然活着的对象从年轻一代转移到老一代。 2)非堆分为 我想知道的是:

  • Java8的默认垃圾收集器是什么? 当我检查JMX bean时,他们发现它是新一代的并行收集器,旧一代的旧串行收集器。