Удалить объект из памяти в Java - PullRequest
0 голосов
/ 02 января 2012

Я создал график, который содержит узлы и дуги.Когда я закрываю приложение SWING и вручную обновляю структуру графа (т.е. удаляю некоторые узлы и дуги), старая структура графа не удаляется из памяти.Например:

ArrayList<Node> nodes = new ArrayList<Node>();
ArrayList<Arc> arcs = new ArrayList<Arc>();
nodes.add(new Node("N1"));
nodes.add(new Node("N2"));
nodes.add(new Node("N3"));
arcs.add(new Arc("N1","N2"));
arcs.add(new Arc("N2","N3"));
Graph g = new Graph(nodes,arcs);

В классе Node у меня есть:

@Override
public String toString() {
    return super.toString() + 
           (isNotConnected() ? " IS NOT CONNECTED" : "" );
}

Затем я закрываю приложение, удаляю узел "N3" и дугу ("N2", "N3") и снова запустите приложение.Это говорит о том, что N3 IS NOT CONNECTED.Но я удалил N3 !!!Чтобы закрыть приложение, я использую:

frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

Также я попытался использовать g = null, но это также не помогло.

ОБНОВЛЕНИЕ:

public class Node {
    private List<Arc> incoming = new ArrayList<Arc>();
    private List<Arc> outgoing = new ArrayList<Arc>()

    protected Node(String name) {
        super(name);
    }

// ...

    public boolean isNotConnected() {
        return incoming.isEmpty() && outgoing.isEmpty();
    }

    public void addIncoming(Arc arc) {
        this.incoming.add(arc);
    }

    public void addOutgoing(Arc arc) {
        this.outgoing.add(arc);
    }

}

Ответы [ 2 ]

2 голосов
/ 02 января 2012

Маловероятно, что что-либо " не удалено из памяти " - каждый новый прогон - это новая JVM, и это означает абсолютно чистый лист, без истории с предыдущего прогона.

Так что я бы исключил эту возможность.Что осталось тогда?

  • У вас может быть ошибка в методе isNotConnected() - маловероятно, так как я надеюсь, что вы получили право super.toString().
  • У вас может быть старшекод работает.Его можно легко диагностировать, изменив любую напечатанную строку, например, перейдя с «НЕ ПОДКЛЮЧЕНО» к «Не подключено» - без изменений в логике, но легко заметить в журналах.
  • У вас может быть еще одна точкав коде, где вы создаете N3
  • и т. д. и т. д.

Здесь важно то, что вы никогда не должны обвинять магическую неочищающую память, прежде чем исключить все остальныевозможности.

Веселись!

1 голос
/ 02 января 2012

невозможно. Вы не можете правильно определить свою проблему. Возможно, вы не компилируете свой код каждый раз и запускаете старые двоичные файлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...