gpt4 book ai didi

java - java中的静态内存是怎么回事?

转载 作者:IT老高 更新时间:2023-10-28 20:56:57 24 4
gpt4 key购买 nike

这个问题特别针对 java 语言。我了解所有静态代码都预留了一个静态内存。

我的问题是这个静态内存是如何填充的?静态对象是在导入时还是在第一次引用时放入静态内存中的?此外,对于静态对象的垃圾回收规则是否与对所有其他对象一样?


public class Example{
public static SomeObject someO = new SomeObject();
}
/********************************/
// Is the static object put into static memory at this point?
import somepackage.Example;

public class MainApp{
public static void main( Sting args[] ){
// Or is the static object put into memory at first reference?
Example.someO.someMethod();
// Do the same garbage collection rules apply to a
// static object as they do all others?
Example.someO = null;
System.gc();
}
}

最佳答案

导入与已编译代码中的任何指令无关。他们建立别名仅在编译时使用。

有一些反射方法允许类被加载但尚未初始化,但在大多数情况下,你可以假设每当一个类被引用时,它就已经被初始化了。

静态成员初始化器和静态 block 的执行就像它们在源代码顺序中都是一个静态初始化器 block 一样。

通过静态成员变量引用的对象被强引用,直到类被卸载。普通的 ClassLoader 永远不会卸载类,但应用服务器使用的类在正确的条件下会这样做。然而,这是一个棘手的领域,并且是许多难以诊断的内存泄漏的根源——这也是不使用全局变量的另一个原因。


作为一个(切线的)奖励,这里有一个需要考虑的棘手问题:

public class Foo {
private static Foo instance = new Foo();
private static final int DELTA = 6;
private static int BASE = 7;
private int x;
private Foo() {
x = BASE + DELTA;
}
public static void main(String... argv) {
System.out.println(Foo.instance.x);
}
}

这段代码会打印什么?试试看,你会看到它打印出“6”。这里有几件事在起作用,其中之一是静态初始化的顺序。代码执行起来就像是这样写的:

public class Foo {
private static Foo instance;
private static final int DELTA = 6;
private static int BASE;
static {
instance = null;
BASE = 0;
instance = new Foo(); /* BASE is 0 when instance.x is computed. */
BASE = 7;
}
private int x;
private Foo() {
x = BASE + 6; /* "6" is inlined, because it's a constant. */
}
}

关于java - java中的静态内存是怎么回事?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/405364/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com