【问题标题】:Uninitialized static variable in memory in JavaJava内存中未初始化的静态变量
【发布时间】:2014-07-24 09:57:17
【问题描述】:

在下面的例子中,内存是分配给 j 的吗?如果是这样,假设 j 永远不会被初始化,j 的地址是否可以在整个程序中改变?

public class c{
    private static String j;
    public c(){}
    ....
}

【问题讨论】:

  • Java 没有“地址”的概念。
  • 你是不是碰巧在谈论参考 ID?-1。
  • 我不明白你在问什么……你能说清楚一点吗?
  • @Deepanshu Bedi 我的意思是参考
  • Java也没有内存分配的概念。

标签: java memory static


【解决方案1】:

JVM 会延迟加载一个类。在第一次引用该类时,将分配该类,并且将为所有静态字段布置内存。在这种情况下,j 将保持“null”。类及其字段的分配位置取决于 JVM,尤其是选择的垃圾收集器。

Java 语言不像 C 等其他语言那样提供对底层内存地址的直接访问。是的,底层内存地址可能会随着/何时/如果垃圾收集器决定重新定位该类而改变;一些 GC 不会重新定位类,旧的甚至无法回收它们。需要注意的是,GC 的任何移动对 Java 程序都是不可见的。也就是说,只要避免使用 sun.misc.Unsafe,sun.misc.Unsafe 就是 Java 5 中添加的 JVM 的后门。

有关 Unsafe 的更多详细信息,blog 有一个很好的概述。

【讨论】:

  • 只是我的 2 美分。由于j是String,是一个不可变的对象,每次j的值改变jvm都会创建一个新的对象,所以j的引用也会改变。
  • @holap - 两个不同的东西。有“j”指向对象的指针的存储,还有对象本身(如果有的话)的存储。由于对象是不可变的,因此必须创建一个新对象,但指针本身只会将其值更改为指向新对象,而不是其存储位置。更改指针本身的存储位置往往只是为了方便 JVM 及其内存管理器。
【解决方案2】:

在下面的例子中,内存是分配给 j 的吗?

JVM 将内存分配给包含j 静态变量的帧。它默认初始化为null。但是,null 不引用任何堆节点。

如果是这样,假设 j 永远不会被初始化,j 的地址是否可以在整个程序中改变?

没有具体说明,但根据我对 JVM 的典型实现方式的理解,j 的地址可能会改变。

但是,除非程序尝试从本机代码(或等效代码)访问j,否则它不会知道地址或可能对其进行的更改。

【讨论】:

  • frame,如在方法调用栈中,还是在其他地方?
  • 不是堆栈帧/本地帧。与类关联的框架。 (实际上,JVM 规范并没有讨论静态变量的表示方式/位置。它只是说使用 getStatic / putStatic 字节码访问/设置它们......
  • 静态变量(对象)未显式初始化时(默认为null),是否占用内存?
  • @EricWang - 是的。它需要的内存量与保存对已分配给变量的对象的引用所需的内存量相同。
  • @EricWang - 即 ... 4 字节或 8 字节,具体取决于 JVM 上的引用大小;即它是特定于平台的,
【解决方案3】:

首先是Java。所以不谈地址访问和地址变更。

编译器代表用户为程序的优化和效率做这一切。

接下来,由于变量 j 已被声明为静态,您无法确定地址,但即使在其块结束后,它的值也会在声明时永久存在,除非更改。 (这意味着即使在访问它并声明它的块发生更改之后,它也不会丢失值。)

只有在程序终止后才会失去它的价值!

【讨论】:

    【解决方案4】:

    你可以说它只是指向null 引用。 Java 中的内存是使用动态内存运算符分配的,即 new 运算符(像 String 这样的某些类具有可以使用 = 运算符初始化的特权)。

    【讨论】:

      【解决方案5】:

      Java 不是 C ...每条数据(甚至是静态变量)都被隐式初始化(​​通常为 null 或 0),编译器不会接受未初始化的局部变量。找到this explanation

      【讨论】:

      • 方法中的局部变量也是这样吗?
      • 我很确定他们没有
      • 是的@BasileStarynkevitch,这些默认情况下不会初始化为 0 或 null。事实上,对于局部变量,它不会以任何语言发生!
      猜你喜欢
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 1970-01-01
      相关资源
      最近更新 更多