【问题标题】:Static variable memory allocation静态变量内存分配
【发布时间】:2014-10-07 08:20:59
【问题描述】:
class A            // Normal Class
{  
  static int i;    // Static int variable  
  int j;           // Normal int variable  
}  

假设我创建了两个对象,即A1A2
两个对象是否为变量i 或公共永久空间分配了单独的内存

A1A2 的大小是多少?如果假设int的大小假设为2字节。

【问题讨论】:

  • 它是静态的。它与类的实例无关。
  • 每个实例的大小是多少?如果 int 的大小假定为 2 个字节
  • 为什么假设 int 的大小为 2 个字节? int 属性至少占用 4 个字节,由于内存对齐问题,可能占用 8 个字节。 Java 对象也有很大的内存开销,new Object() 在 64 位 HotSpot 上需要 24 个字节。

标签: java memory-management static


【解决方案1】:

相同的内存,static 成员变量在实例之间共享,因为 staticclass level 并且它们都属于同一个类。

至于对象的大小,他们将size of the object minus the static member variables

还有

  • static 有一个小写的 's',而不是大写。关键字区分大小写。
  • int4 bytes,而不是 2

【讨论】:

  • 我想知道 var i 的大小是否添加到实例大小中。对象大小是否仅为 (size(i)+ size(j)) 或 (size(j))。 bcoz var i 是单独存储的
  • i 没有添加到对象大小中,它基本上被视为仅由该类访问的单独全局变量。
【解决方案2】:

这两个对象是否都为变量 i 分配了单独的内存?

静态成员处于类(而不是实例)级别。因此,将只有一个 int ij 处于实例级别,因此 A 的每个实例中都会有一个 j

所以,你的问题有点无效。为什么? 因为 static 与类的实例没有关系(就像 Marko Toplonik 说的)

instanceOfA.i 实际上会被解析为A.i

【讨论】:

    【解决方案3】:

    每个实例的大小是多少

    对象的大小仅取决于实例成员。

    如何证明?

    计算 A 类型对象的大小并检查打印内容,然后在 A 类中没有静态变量的情况下执行相同操作?

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(baos);
    oos.writeObject(new A());
    
    System.out.println(baos.size());
    

    【讨论】:

      【解决方案4】:

      静态实例在类模板内部声明。编译器只将类加载到内存中,使用此模板编译器创建字节码。 JVM正在使用这个类模板创建对象,并且不会加载越来越多的相同类模板来创建越来越多的对象。因此静态实例只声明一次。同一个类的每个对象都访问同一个静态实例。

      祝你好运!!!

      【讨论】:

      • Compiler 不执行加载 类和创建对象的任务。 JVM 就是这样做的
      【解决方案5】:

      静态变量在加载类时加载,因此无论创建的对象数量如何,都会为它们分配一个恒定的内存空间。

      因此,变量i 的内存对于所有创建的对象都保持不变。

      您甚至可以在不创建对象的情况下访问静态变量和函数,只需使用类名。

      class A
      {
          static int i;
      }   
      
      A.i=10;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-02
        • 1970-01-01
        • 1970-01-01
        • 2012-11-29
        • 1970-01-01
        • 1970-01-01
        • 2014-05-21
        相关资源
        最近更新 更多