Java中的jvm,原语静态变量和静态函数存储在哪里?
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()
存储在哪里
# 1 楼答案
这些是实现细节,如果不先阅读并理解其源代码,我们无法确定每个实现都做了什么。就我的知识和经验而言,最合理的假设(对于桌面JVM)是:
s
和i
是静态变量。静态变量可能是在永久生成的堆上分配的李>j
存储在类A
的实例中。类实例可能存在于堆栈上(如果对引用的转义分析可以证明引用具有自动存储语义,并且它们足够小),也可能存在于堆上(如果没有执行转义分析,或者转义分析不确定,或者实例对于堆栈来说太大)李>k
是一个具有自动存储语义的局部变量,因此它应该位于堆栈上。它在输入其包含方法(getStaticString
)时分配,在退出其包含方法时解除分配李>l
与k
具有相同的语义。它的包含方法(getString
)不是静态的,这一事实与此无关李>getString
(以及任何其他用户代码,无论其语言属性为静态、非静态等)有两种表示: