何时对具有静态数据的类进行垃圾收集

时间:2009-06-17 06:54:09

标签: java static garbage-collection

我希望在整个应用程序中轻松提供一些数据。我在类中有一些带有静态数据的变量,可以在几个不同的点上写入和读取。

这种方法工作正常一段时间,但现在我希望能够检索到一个ArrayList,我得到的只是“null”。

我想知道静态类是否已经发送到“垃圾收集器”。不确定发生了什么,如果你能提供帮助,那将非常感激。

10 个答案:

答案 0 :(得分:9)

您可以尝试将其设为 final ,然后重新编译代码以查看是否有其他类更改了对null的引用:

public class Global {

    public final static List<String> data = new ArrayList<String>();

}

这允许写:

Global.data.add("foo");

但不是:

Global.data = null;

答案 1 :(得分:3)

  

我在静态中有一些变量   上课,写到... at   几个不同点。

当您自己承认时,可以在一个或多个不同点处为变量分配null。 :)

答案 2 :(得分:3)

正如Svetlio所说,GC只在堆上的对象上运行,这些对象在任何地方都没有引用。这可能需要x个周期,具体取决于您使用的GC策略和VM。由于静态类被无限期引用,它们永远不会被GC。

所以仍然存在一些问题:

  1. 它是否可以成为程序设置类的一部分为null?只要你的arraylist设置为null,你能设置一个调试标志来尖叫吗?
  2. 这是在特定时间发生的吗?在启动时?过了一会儿?
  3. 一个愚蠢的问题,但你不能随时在你的静态课上运行new吗?
  4. Lasty,正如你所说的......静态变量除了常量之外还有其他任何东西:P单例配置真的很便宜而且好多了。

答案 3 :(得分:3)

最初的问题:

  

什么时候静态类会发生垃圾收集?

答案:当你的申请退出时。

答案 4 :(得分:2)

如果你可以调用该函数,那么该对象将不会被垃圾收集掉,因为它仍然存在对它的引用。 你是存储指向arraylist或对象本身的指针吗?

答案 5 :(得分:2)

如果类加载器被垃圾收集,则会发生类的垃圾收集。例如,请参阅this question。在早期的Java中有一个排序时间(我认为在1.2中),GC没有考虑静态字段,许多类卸载/重载导致空字段。

答案 6 :(得分:1)

静态类与静态变量不同。它只是关键字“静态”的另一种用途。在这种情况下,它表示该类是顶级的,但在另一个类中声明。

这意味着你可以实例化这个类的多个对象,而不像一个静态变量,只有一个副本。

您是否实例化了多个并期望它们是同一个?

GC听起来不像是问题。如果对象不再存在,则根本无法从中检索ArrayList。

答案 7 :(得分:0)

垃圾收集器不会自己配置静态类。垃圾收集器只有在没有对类的引用时才能激活。只要你可以自己调用类,就有一个参考。 此外,您无法确定垃圾收集器何时处于活动状态。如果在后台执行空闲任务,它会运行。

我建议你在静态类中添加一些调试跟踪消息,这样你就可以看到它被调用的时间。必须有一些副作用在运行时更改ArrayList。

答案 8 :(得分:0)

如果静态位于不同的线程中,则静态可以为null。否则,如果你不说别的话就应该在那里。

答案 9 :(得分:0)

这样的事情

private static List<T> list;


public static List<T> getList() {
    if(list==null)
        initList(); //private static method init list like you want
    return list;
}