我希望在整个应用程序中轻松提供一些数据。我在类中有一些带有静态数据的变量,可以在几个不同的点上写入和读取。
这种方法工作正常一段时间,但现在我希望能够检索到一个ArrayList,我得到的只是“null”。
我想知道静态类是否已经发送到“垃圾收集器”。不确定发生了什么,如果你能提供帮助,那将非常感激。
答案 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。
所以仍然存在一些问题:
new
吗?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;
}