【问题标题】:Are main command line args stored in stack memory or heap memory?主命令行参数是存储在堆栈内存还是堆内存中?
【发布时间】:2020-01-10 01:28:45
【问题描述】:

这可能是个愚蠢的问题...

看看大学里JVM栈内存和堆内存通常是怎么画的,它们通常显示调用栈和被调用的方法,其中定义的变量和参数(栈内存)和任何分配的对象(堆)记忆)。

举一个简单的hello world例子:

public class Program {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

它们总是省略绘图中的静态主要参数 (String[] args)。是否有与普通堆栈内存参数不同的特殊规则或存储 args 的位置?

如果无法在 Google 中找到结果,我必须假设没有特殊规则/异常,我应该在堆栈中有一个“args”变量指向包含命令行参数的堆分配数组,我错了吗?

【问题讨论】:

  • 数组是对象。所以它是堆。
  • 感谢@Turing85,所以他们没有奇怪的存储位置或例外吗?那么,为了清楚起见,是否只是省略了它们?
  • 我认为没有规则。任何 JVM 都可以明智地选择其中之一。我相信 @Turing85 是正确的,即当前的 Oracle JVM 版本使用堆,但如果开发人员选择这样做,我看不到任何东西可以阻止下一个版本使用堆栈。
  • 好的,我必须纠正自己。 JLS 关于对象的存储位置非常浅薄。另一方面,JVMS 相当冗长:“heap 是运行时数据区域,所有类实例和数组的内存从该区域分配。 "
  • 参数和局部变量差不多,只是在方法外初始化而已。每个方法调用都会在堆栈上获得一个 Frame,其中包含包含参数的局部变量。确定引用的实例在堆上。所有实例都在哪里。 JVM 规范:2.6. Frames

标签: java memory jvm stack heap-memory


【解决方案1】:

命令行参数存储在String-array 中。 All arrays are stored on the heap。因此,命令行参数存储在堆上。

我假设您的主管 - 正如您在评论中建议的那样 - 为清楚起见省略了它们。

【讨论】:

    猜你喜欢
    • 2016-03-25
    • 2019-09-12
    • 1970-01-01
    • 2021-06-19
    • 2015-05-03
    • 2011-11-08
    • 1970-01-01
    • 2021-10-04
    相关资源
    最近更新 更多