用Java从内存中删除一个对象

时间:2012-01-02 12:19:25

标签: java memory memory-management graph

我创建了一个包含节点和弧的图表。当我关闭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 个答案:

答案 0 :(得分:2)

没有从内存中删除”的可能性很小 - 每次新的运行都是一个新的JVM,它意味着绝对干净的表,没有上一次运行的历史记录。

所以我把这种可能性排除在外。那剩下什么了?

  • 您可能在isNotConnected()方法中遇到错误 - 不太可能,因为我希望您有super.toString()权利。
  • 您可以运行较旧的代码。它可以通过更改您打印的任何字符串轻松诊断,例如从“未连接”变为“未连接” - 逻辑没有变化,但很容易在日志中找到。
  • 您可以在创建N3
  • 的代码中再添加一个点
  • 等等。

这里最重要的是,在排除所有其他可能性之前,你永远不应该责怪神奇的非清洁记忆。

玩得开心!

答案 1 :(得分:1)

这是不可能的。您没有正确检测到您的问题。可能你不是每次都编译代码并运行旧的二进制文件。