【发布时间】:2014-05-31 09:23:58
【问题描述】:
我很想知道整数和整数数组是如何存储在 java 中的堆栈/堆中的,有人可以指出我的链接吗?或者谁能给我解释一下。
更新 1: 以及这如何影响整数和整数数组作为参数传递给 Java 中的方法的方式。
谢谢
【问题讨论】:
标签: java integer heap-memory stack-memory
我很想知道整数和整数数组是如何存储在 java 中的堆栈/堆中的,有人可以指出我的链接吗?或者谁能给我解释一下。
更新 1: 以及这如何影响整数和整数数组作为参数传递给 Java 中的方法的方式。
谢谢
【问题讨论】:
标签: java integer heap-memory stack-memory
每当您在本地范围(方法)内声明变量时,它都会被放入堆栈。
即:Type myVariable 会将新变量的空间推送到该方法堆栈框架上,但由于未初始化,因此尚不可用。
当您为变量赋值时,该值将被放入堆栈的保留空间中。
现在是棘手的部分。如果类型是原始类型,则该值包含您分配的值。例如,int a = 55 会将值 55 放入该空格。
但是,如果类型是非原始类型,即 Object 的某个子类,则放入堆栈的值实际上是一个内存地址。此内存地址指向堆上的一个位置,即存储实际对象的位置。
对象在创建时被放入堆中。
一个例子
private void myMethod()
{
Object myObject = new Object();
}
我们声明了一个变量,所以我们在堆栈帧上获得了空间。类型是一个对象,所以这个值将是一个指针,指向创建对象时分配的堆空间。
【讨论】:
方法变量存储在堆栈中。另一方面,对象存储在堆中,如下图所示。 这就是为什么如果你得到 StackOverFlowException,这意味着你在一个方法中声明了太多的变量,或者你在递归调用中调用了太多的方法。如果你得到 Java 堆空间错误,这意味着你创建的对象比你做的多。 Stack和Heap的解释,我推荐this link
【讨论】:
变量只包含对这个对象的引用,如果是局部变量,这个引用存储在堆栈中,但对象的数据指向存储在堆中。
您可以在此处阅读更多信息,例如:link
【讨论】: