java - 在Java中,原始静态变量和静态函数存储在哪里?

标签 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中。 那么ijkl存放在哪里呢?函数 getString() 存储在哪里?

最佳答案

这些是实现细节,如果不先阅读和理解其源代码,我们无法确定每个实现的作用。就我的知识和经验而言,最合理的假设(对于桌面 JVM)是​​沿着这些线:

  • si 是静态变量。在永久代中,静态变量可能分配在堆上。
  • j 存储在类 A 的实例中。类实例可能存在于堆栈中(如果对引用的逃逸分析可以证明引用具有自动存储语义——并且它们足够小)或堆中(如果逃逸分析未执行或不确定或实例对于堆栈)。
  • k 是一个具有自动存储语义的局部变量,因此它应该存在于堆栈中。它在其包含方法 (getStaticString) 进入时分配,并在其包含方法退出时释放。
  • lk 具有相同的语义。它的包含方法 (getString) 不是静态的这一事实无关紧要。
  • getString(以及任何其他用户代码,无论其语言属性是静态的、非静态的等)有两种表示形式:
    • 它的元数据和字节码(AOT 编译)是其包含类的类数据的一部分。它在内存中的生命周期可能与与此代码关联的类的加载/卸载相关联,但与该类的任何特定实例无关。换句话说,不是每次创建实例时都“创建”非静态方法。
    • 它的编译代码(JIT 编译)应该永久存在于单独的内存段(JIT 编译器的非托管堆的一部分,写入并标记为可执行),独立于 Java 对象的生命周期。

关于java - 在Java中,原始静态变量和静态函数存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26564250/

相关文章:

java - 如何找出创建垃圾对象的代码

java - 在格式化程序对象中使用 "\n"

Java 类加载器俄罗斯套娃

java - 什么是克拉斯和克拉斯克拉斯

java - 如何控制老年代的java堆大小?

java - 来自 JNI_CreateJavaVM (jvm.dll) 的异常 0xC0000005

java - java中的字节数组

java - 访问由私有(private)自定义类组成的链表的元素

java - war中包含的运行时依赖

java - 物质和 MacOS 菜单栏