Java中的垃圾收集器如何处理POJO中的变量?

时间:2014-12-20 05:45:50

标签: java garbage-collection

我正在尝试修复程序中的内存泄漏,我的大脑开始抛出OutOfOptions Exceptions。该程序创建了很多对象,只要它们不再需要就用object = null取消引用它们,但不知何故,内存使用量会随着时间的推移而不断增长。现在我问自己是否必须在对象内部取消引用变量。

例如:

public class Pojo {

    private String foo;
    private Integer bar;
    private AnotherPojo anotherPojo;

    public Pojo(String foo, Integer bar, AnotherPojo anotherPojo) {
        this.foo = foo;
        this.bar = bar;
        this.anotherPojo = anotherPojo;
    }

}
// ...
Pojo pojo = new Pojo("foo", 123, new AnotherPojo())
// ...

是否足以执行pojo = null或者我是否还需要在Pojo对象中单独取消引用每个变量?

1 个答案:

答案 0 :(得分:1)

你只需要使pojo引用为空,而不是pojo中保存的引用。

来自程序roots的垃圾收集器跟踪以查找潜在的活动对象,其中根通常是堆栈上的引用,即方法调用中的引用。如果无法从根目录访问对象,则该对象引用的任何对象都不能通过该对象传递到达,尽管引用的对象可以通过根或通过根可到达的另一个对象链直接访问。但是如果一个对象因为你已经找不到对它的所有引用而无法访问,那么对象引用的其他对象(包括自引用)并不重要,因为这些引用不会被垃圾收集器跟踪 - 因此您不需要使对象持有的引用为空。

如果您还没有这样做,那么我建议您使用类似Eclipse's memory analyzer的内容来帮助您找出泄漏发生的位置。

一个内存泄漏场景是你有一个Big Collection Full Of Everything,即使在程序中的其他地方被淘汰之后也可以使对象可以访问;在这种情况下,您的选项是从这些数据结构中删除大部分死对象,或者如果这不实用/可行,您可以使用WeakReferencesSoftReferences填充集合 - 这些告诉垃圾收集器“如果只保留一个对象是弱或软的话,那么回收一个对象是好的“(弱引用通常比软引用更急切地收集)。如果Big Collection是一个地图,那么Java提供了一个WeakHashMap,您可以使用它。