以下是我测试静态变量寿命的程序。
public class A {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(new B());
thread.start();
while(thread.isAlive()){
Thread.sleep(1000);
}
System.gc();
Thread thread2 = new Thread(new B());
thread2.start();
while(thread2.isAlive()){
Thread.sleep(1000);
}
System.gc();
System.out.println("Last One :: " + B.name);
}
}
B.java
public class B implements Runnable{
public static int name;
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("Finalize called");
}
@Override
public void run() {
for(int i=0;i<10;i++){
name++;
}
System.out.println("Class B :: " + name);
}
}
输出:
Class B :: 10
Finalize called
Class B :: 20
Finalize called
Last One :: 20
第一个线程创建B的新实例,启动 name 变量的线程增量指针,主线程等待< strong> thread 完成并调用GC.Again我重复这个过程,即使在B的线程创建实例完成并且GC运行2次之后仍然保持旧指针。如何存储静态变量记忆以及它们在记忆中的维护时间?
答案 0 :(得分:3)
答案 1 :(得分:2)
B.name
与任何特定对象无关:它是一个类变量,因此只要该类仍然可用(在这种情况下,这意味着程序的生命周期),它仍然可用。
此外,值得注意的是(即使它与此特定问题无关),System.gc()
是一个建议,而不是保证垃圾收集将立即开始并在程序中的下一行之前完成执行。