垃圾收集器可以在Static类对象上运行

时间:2014-07-17 09:04:45

标签: java garbage-collection garbage

我必须上课,谁的对象永远不会被垃圾收集。所以,如果我将类作为静态进行,它会避免对象上的垃圾收集,或者是否还有其他方法可以做到?

5 个答案:

答案 0 :(得分:1)

简短回答:。将您的类标记为静态可能无法将其从垃圾回收中保存

使类静态可以避免负责加载它的特定类加载器的垃圾收集。但是,如果这个类加载器选择了垃圾收集,那么通过它加载的所有类(静态或非静态)也将被垃圾收集。

通常,在应用程序中有多个类加载器时就是这种情况。

除此之外,当一个对象(任何对象)变得无法访问

时,它会选择进行垃圾回收。

来自JLS(source

  

当且仅当其定义的类加载器可能被垃圾回收器回收时,可以卸载类或接口[...]可能无法卸载由引导加载程序加载的类和接口。

答案 1 :(得分:1)

当相应的静态变量类加载到JVM中时,垃圾收集器不会回收静态变量。

请参阅下面的stackoverflow链接

答案 2 :(得分:0)

一个对象要么可以无法访问,这与它所属的哪个类没什么关系。

如果您的对象无法访问,则它是垃圾,因为您无法联系它。

如果要在整个应用程序的生命周期内使对象生效,只需将其分配给静态变量,以便永久保持可访问状态。基本上,您正在寻找Singleton模式。

应用于类的static修饰符仅允许用于嵌套类,并且它使该类成为非内部类,这意味着它不需要封闭实例。这与垃圾收集问题无关。

答案 3 :(得分:0)

  

如果我将一个类声明为静态,是否会阻止其实例的垃圾收集?

没有

(嵌套)类上的static修饰符意味着字段上与static的不同之处。特别是,它(几乎 1 )与可达性或垃圾收集无关。

  

有没有其他方法可以做到这一点?

如果要确保某个类的实例永远不会被垃圾回收,则必须确保它始终可以访问。

一种方法是声明static变量并将实例的引用分配给该变量。在正常情况下 2 static变量对于整个应用程序运行仍然可以访问,因此它们引用的对象仍然可以访问。这意味着它们不会被垃圾收集。

另一种方法是将引用保存在main(...)方法中声明的局部变量中。

还有其他方法。


1 - 轻微的问题是,非静态嵌套类的实例具有对封闭类的实例的隐式引用。但是这会影响后一个实例的可达性,而不是前一个实例。

2 - 在某些情况下,类静态会收集垃圾,但涉及创建类加载器和动态加载。事实上,这种情况的一个更常见的问题是垃圾收集的类/实例。

答案 4 :(得分:0)

如果您不希望对您的类进行垃圾回收,则必须对其进行引用。最好的方法是让您的加载程序类(例如Android中的Application)持有对它的引用。只要Application仍然存在,您就可以确保垃圾回收器不会碰到您的类。确保它是强引用,而不是弱引用甚至幻像引用