如何在org.openide.util.Lookup中杀死对象

时间:2014-09-15 06:28:59

标签: java memory-leaks gephi

我使用gephi绘制社交图。但是,它使用singleton来创建类ProjectController。

@ServiceProvider(service = ProjectController.class)
public class ProjectControllerImpl implements ProjectController {

private enum EventType {

    INITIALIZE, SELECT, UNSELECT, CLOSE, DISABLE
};
//Data
private final ProjectsImpl projects = new ProjectsImpl();
private final List<WorkspaceListener> listeners;
private WorkspaceImpl temporaryOpeningWorkspace;

public ProjectControllerImpl() {

    //Listeners
    listeners = new ArrayList<WorkspaceListener>();
    listeners.addAll(Lookup.getDefault().lookupAll(WorkspaceListener.class));

    registerNetbeansPropertyEditors();
}

我们可以通过netbeans api获得这个课程:

ProjectController pc = Lookup.getDefault().lookup(ProjectController.class);

你可以看到它在这个类中有一个List。当你从这个单例中创建一个对象时,它会添加list.It使内存泄漏,我想杀死org.openide.util.Lookup中的对象,如何我可以吗?

1 个答案:

答案 0 :(得分:1)

您链接到的ProjectControllerImpl类的代码还包含一个方法removeWorkspaceListener(),您可以使用该方法在不再需要单个侦听器时取消注册(假设您了解这些侦听器并且他们知道这些侦听器)可以删除)。

当然,您可以使用自己的ProjectController实现来以不同的方式处理侦听器:

  • 如果您不希望WeakReference<WorkspaceListener>实例阻止WorkspaceListener被垃圾回收,则可以存储ProjectControllerImpl的实例而不是WorkspaceListener的强引用。 (这意味着只要侦听器实例应该存在,就需要将对每个侦听器的强引用存储在其他位置。)
  • 或者,不要将WorkspaceListener存储在ProjectControllerImpl中,而是在实际需要时通过lookupAll()获取它们。