public Class A {
public static String s = "s";
public static int i = 0;
public int j = 1;
public static String getStaticString() {
int k = 2;
return s;
}
public String getString() {
int l = 3;
return "something";
}
}
在Java
中,静态变量存放在Perm
生成的Heap Segment
中,原始局部变量存放在Stack Segment中
。
那么i
、j
、k
、l
存放在哪里呢?函数 getString()
存储在哪里?
最佳答案
这些是实现细节,如果不先阅读和理解其源代码,我们无法确定每个实现的作用。就我的知识和经验而言,最合理的假设(对于桌面 JVM)是沿着这些线:
s
和i
是静态变量。在永久代中,静态变量可能分配在堆上。j
存储在类A
的实例中。类实例可能存在于堆栈中(如果对引用的逃逸分析可以证明引用具有自动存储语义——并且它们足够小)或堆中(如果逃逸分析未执行或不确定或实例对于堆栈)。k
是一个具有自动存储语义的局部变量,因此它应该存在于堆栈中。它在其包含方法 (getStaticString
) 进入时分配,并在其包含方法退出时释放。l
与k
具有相同的语义。它的包含方法 (getString
) 不是静态的这一事实无关紧要。getString
(以及任何其他用户代码,无论其语言属性是静态的、非静态的等)有两种表示形式:- 它的元数据和字节码(AOT 编译)是其包含类的类数据的一部分。它在内存中的生命周期可能与与此代码关联的类的加载/卸载相关联,但与该类的任何特定实例无关。换句话说,不是每次创建实例时都“创建”非静态方法。
- 它的编译代码(JIT 编译)应该永久存在于单独的内存段(JIT 编译器的非托管堆的一部分,写入并标记为可执行),独立于 Java 对象的生命周期。
关于java - 在Java中,原始静态变量和静态函数存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26564250/