当前位置: 首页 > 面试题库 >

默认堆栈大小是多少,可以增加吗,它如何与垃圾回收一起使用?

井学
2023-03-14
问题内容

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

我的问题是:

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

问题答案:

堆栈可以增长多少?

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

每个线程至少有一个堆栈。某些Java虚拟机(JVM)将Java堆栈(Java方法调用)和本机堆栈(VM中的本机方法调用)放入一个堆栈中,并使用托管到本机框架(称为M2NFrame)执行堆栈退卷。一些JVM分别保留两个堆栈。Xss在大多数情况下,设置Java堆栈的大小。

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

我们可以限制这种增长吗?

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

堆栈是否具有一些默认的最小值或默认的最大值?

如前所述,不同的虚拟机是不同的,并且可能会随着版本的变化而变化。看这里。

垃圾收集如何在堆栈上工作?

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

这只是GC上堆栈的一个非常模糊的用法。当前,大多数JVM使用的是世代GC。本文对Java
GC进行了简要介绍。最近,我读了一篇非常好的文章,内容涉及.net上的GC。oracle
jvm上的GC非常相似,因此我认为这也可能对您有所帮助。



 类似资料:
  • 我知道每个线程都有自己的堆栈。基本类型和引用保留在堆栈上,并且没有对象保留在堆栈上。 我的问题是: 一堆可以长多少?(与参数Xms和Xmx类似)

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

  • 问题内容: 我问了这个问题,以了解如何增加JVM中的运行时调用堆栈大小。我有一个答案,而且我还有很多有用的答案和注释,这些注释和注释与Java如何处理需要大型运行时堆栈的情况有关。我在回答摘要中扩展了我的问题。 最初,我想增加JVM堆栈的大小,以便程序运行时无需安装。 相应的配置设置是具有足够大值的命令行标志。对于TT上面的程序,它可以与OpenJDK的JVM一起工作: 答案之一也指出这些-X…标

  • 我在处理中运行递归方法,但当作业太大时,它会给我以下错误: 由于等待数据包139时超时,事件线程崩溃。 但当递归很小时,它可以工作。有没有办法增加堆栈以解决更大的递归问题? 这是我的代码,用于在屏幕上绘制人物。它适用于较小的数字,但不适用于较大的数字。 回溯:

  • 问题内容: 根据我的理解,如果没有其他“指向”该对象的内容,则Java中的垃圾回收会清除某些对象。 我的问题是,如果我们有这样的事情怎么办: 和应该被垃圾回收,但是它们都被其他对象引用。 Java垃圾回收如何处理呢?(或者仅仅是内存消耗?) 问题答案: 如果无法通过从垃圾回收根开始的链访问对象,Java的GC会将其视为“垃圾”,因此将收集这些对象。即使对象可能指向彼此以形成一个循环,但如果将它们与

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