静态变量的生命周期如何工作?

时间:2014-12-25 12:32:32

标签: java

以下是我测试静态变量寿命的程序。

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次之后仍然保持旧指针。如何存储静态变量记忆以及它们在记忆中的维护时间

2 个答案:

答案 0 :(得分:3)

引自另一篇文章:

  

正如大家在答案中所说,静态变量是类   变量。它们保留在内存中,直到课程没有卸载   来自JVM。

也许这是one的重复。

答案 1 :(得分:2)

B.name与任何特定对象无关:它是一个类变量,因此只要该类仍然可用(在这种情况下,这意味着程序的生命周期),它仍然可用。

此外,值得注意的是(即使它与此特定问题无关),System.gc()是一个建议,而不是保证垃圾收集将立即开始并在程序中的下一行之前完成执行。