Как сборщик мусора в Java обрабатывает переменные внутри POJO?

В настоящее время я пытаюсь исправить утечку памяти в моей программе, и мой мозг начинает выдавать исключения OutOfOptions. Программа создает много объектов, и я обращаюсь к ним с помощью 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 ответ

Решение

Вам нужно только обнулить ссылку на pojo, а не ссылки, содержащиеся в pojo.

Сборщик мусора отслеживает от корней программы, чтобы найти потенциально живые объекты, где корни, как правило, являются ссылками в стеке, то есть ссылками в вызове метода. Если объект недоступен из корней, то ни один из объектов, на которые ссылается этот объект, не может быть транзитивно доступен через этот объект, хотя указанные объекты могут быть непосредственно доступны через корни или через другую цепочку объектов, которые достижимы через корни. Но если объект недоступен из-за того, что вы удалили все ссылки на него, то не имеет значения, на какие объекты ссылаются другие объекты (включая собственные ссылки), поскольку эти ссылки не будут отслеживаться сборщиком мусора. - следовательно, вам не нужно обнулять ссылки, содержащиеся в объекте.

Если вы еще этого не сделали, то я рекомендую использовать что-то вроде анализатора памяти Eclipse, чтобы помочь вам выяснить, где происходит утечка.

Один из сценариев утечки памяти состоит в том, что у вас есть большая коллекция, полная всего, что делает объекты достижимыми даже после того, как они обнуляются везде в программе; в этом случае вы можете удалить практически мертвые объекты из этих структур данных, или, если это непрактично / выполнимо, вы можете заполнить коллекцию с помощью WeakReferences или SoftReferences - они сообщают сборщику мусора, что "нормально восстановить объект, если только ссылки на него являются слабыми или мягкими " (слабые ссылки обычно собираются более охотно, чем мягкие ссылки). Если Большая коллекция - это карта, то Java предоставляет WeakHashMap, который вы можете использовать вместо этого.

Другие вопросы по тегам