【发布时间】: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