2014-12-20 1 views
0

В настоящее время я пытаюсь исправить утечку памяти в своей программе, и мой мозг начинает выбросить OutOfOptions Exceptions. Программа создает много объектов, и я разыгрываю их с помощью object = null, как только они больше не понадобятся, но почему-то использование памяти продолжает расти с течением времени. Теперь я спрашиваю себя, нужно ли мне пересматривать переменные внутри объекта.Как сборщик мусора в Java обрабатывает переменные внутри POJO?

Например:

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

Возможный дубликат [Как работает сборка мусора Java с Циркулярными ссылками?] (Http://stackoverflow.com/questions/1910194/how-does-java-garbage-collection-work-with-circular-references) – Joe

+0

как вы пытаетесь решить проблему с памятью, вы должны попробовать взять кучу сваливания на разные и проанализировать. какие объекты не получают сбор мусора – Panther

ответ

1

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

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

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

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

+0

Большое спасибо, исследуем это. У меня на самом деле есть «Большая коллекция, полная всего» :-) – rapstacke

+0

@ Horstus Я подозревал, что это может быть так, поэтому я специально обратился к ней - большинство утечек памяти Java, с которыми я столкнулся, - из Big Collections Full Of Все –

Смежные вопросы