【问题标题】:Where does the Java store the final member and static member?Java在哪里存储final成员和静态成员?
【发布时间】:2015-01-07 17:50:34
【问题描述】:

我知道一个类的静态方法和非静态方法都存放在方法区。
但是我真的很怀疑Java在哪里存储对象的最终变量(常量)成员和静态变量成员。


例如,

class A{
     private final int a = 1;
     private static int b = 2;
     private static final int c = 3;
     //other codes...
}

我想知道 Java 将 a,b,c 存储在内存中的什么位置。堆、栈还是方法区?


======更新=====
嘿,谢谢你的帮助。请允许我分享一个关于 jvm 组件的链接:http://www.artima.com/insidejvm/ed2/jvm2.html

【问题讨论】:

标签: java memory-management static final


【解决方案1】:

在 Java 虚拟机实例中,有关加载类型的信息存储在称为 method area 的内存逻辑区域中。类中声明的类(静态)变量的内存取自方法区域。

所有实例变量都将存储在heap area,包括最终成员。

【讨论】:

  • 感谢您的回答。那么最终成员的存储呢?
  • 即使它是最终变量,它仍然是一个实例变量。因此,它将与对象数据一起存储在堆区域中。
【解决方案2】:

在我的测试中,我有这个结论。

   1. private final int a = 1; // heap with object
   2. private static int b = 2; // class variables of Method Area
   3. private static final int c = 3; // run-time constant pool of Method Area
  1. final int 在构造函数上创建。这意味着它与对象有关。
  2. 静态 int 在静态 {} 上创建。这意味着它与静态变量有关 静态变量等于方法区的类变量。
  3. static final int 在常量池中,没有相关代码。它的意思是 它将在运行时被引用。

Bytecode Analysis

【讨论】:

    猜你喜欢
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    相关资源
    最近更新 更多