【问题标题】:System stack allocation in recursion递归中的系统堆栈分配
【发布时间】:2013-07-07 01:19:53
【问题描述】:

众所周知,所有大多数递归函数都可以修改为迭代方法。假设我们以添加两个表示两个巨大数字的链接列表为例。这个问题可以通过递归(使用系统堆栈)或迭代(显式堆栈使用)方法来解决。

我的疑问是,如果我将 jvm 堆大小指定为 -Xms2048MB -Xmx2048M,那么在递归方法中,它是否会将所有堆内存用于系统堆栈? AFAIK,如果我将使用显式堆栈,那么它可以消耗所有这些内存。如果有人还可以告诉我如何、何时以及分配多少系统堆栈内存以及一些工作原理,那就太好了。即使指向一些不错的教程也会有很大帮助。如果可以将其限制在 w.r.t 范围内,则尽可能javaworld 那么很好。谢谢。

【问题讨论】:

  • 注意:String 是可以在堆栈上的引用,但实际对象在堆上。如果你使用对象,你应该假设无论你做什么它们都会使用堆空间。
  • 顺便说一句,我只会写 -Xmx2g-mx2g 或者不设置它,默认是主内存大小的 1/4,只要你有一台像样的机器,你可能不会需要设置。

标签: java operating-system jvm heap-memory


【解决方案1】:

这是不可能发生的,因为堆栈帧有自己的大小。这个大小可以通过命令行参数-Xss<size>调整。

堆内存与这个栈内存完全分离。

默认堆栈大小取决于您正在运行的 JVM

【讨论】:

  • +1 堆栈不使用任何堆,但任何引用的对象仍将在堆上。例如如果您通过递归或迭代使用对象,则它们位于堆上,而不是堆栈上。
  • @PeterLawrey 这是一个有效的观点,但从我如何理解原始发布者想知道堆栈是否耗尽所有堆的问题来看......
  • true,但堆栈可能不会像 OP 认为的那样被吃掉,并且 OP 可能会在用完堆栈之前用完堆,从而造成混乱。
  • +1 @Uwe Plonus 这个系统堆栈包含什么,因为如果所有对象都在堆中分配?任何好的链接或书籍都可以深入了解。谢谢。
  • @Trying 原则上只有返回地址和指向调用的值的指针存储在堆栈中。你可以在VM specification阅读更多内容。
猜你喜欢
  • 2014-01-02
  • 2023-03-23
  • 1970-01-01
  • 2015-09-12
  • 2021-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
相关资源
最近更新 更多