我正在考虑 Java 中的内存分配,即 存储位置方法、字段和对象。
假设我有 2 个类
import java.util.*;
class ABC
{
int field;
List<Integer>l;
}
class XYZ
{
int x,y,z;
static int p;
void fun(ABC a){
a.field = 10;
a.l = new ArrayList<Integer>(10);
a.l.add(10);
}
}
public class Simulator{
public static void main(String[] arg){
XYZ tmp_1 = new XYZ();
ABC tmp_2 = new ABC();
tmp_1.fun(tmp_2);
System.out.println(tmp_2.l);
}
}
现在将为每个数据成员、函数和对象分配内存在哪里?
我的想法是对象,数据成员将存储在堆中,但我不确定函数及其数据成员?
最佳答案
是的,所有对象都分配在堆上。即:使用 new
创建的所有内容都将放在堆上。因此,此类对象的所有字段也在堆上。
我想您指的是函数中的局部变量和参数。这些都放在堆栈上(对于函数的每次调用)。但是请注意,当函数变量/参数是引用类型时,它们指向的实际对象在堆上,但变量/参数本身将在堆栈上(类似于 C/C++ 中的指针)。另一方面,原始类型(如 int
、double
等)的函数变量/参数将完全在堆栈上。与主题稍微相关但相关的是 boxing 的概念。 .
函数本身是静态代码,存储在所有可执行代码所在的内存的特殊部分。请注意,一个类的所有实例都共享相同的函数(即“新函数”不是用新创建的对象创建的,即使这些函数是实例函数)。因此,当您在对象上调用实例函数时,一个特殊的 this
引用将传递给该函数(它是该函数的隐式参数)。这就是函数如何知道它应该作用于哪些对象。
关于java - JVM 中的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9554415/