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

Java 如何杀死org.openide.util.Lookup中的对象,java,memory-leaks,gephi,Java,Memory Leaks,Gephi,我使用gephi来绘制社交图。但是,它使用singleton来创建类ProjectController @ServiceProvider(service = ProjectController.class) public class ProjectControllerImpl implements ProjectController { private enum EventType { INITIALIZE, SELECT, UNSELECT, CLOSE, DISABLE }; /

我使用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();
}

你可以看到它在这个类中有一个列表。当你从这个单例创建一个对象时,它会添加这个列表。它会导致内存泄漏,我想在org.openide.util.Lookup中杀死这个对象,我该怎么办?

你链接到的
ProjectControllerImpl
类的代码也包含一个方法
removeWorkspaceListener()
,当不再需要单个侦听器时,可以使用它来注销这些侦听器(假设您知道这些侦听器并且可以删除它们)

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

  • 如果不希望
    ProjectControllerImpl
    实例阻止
    WorkspaceListener
    被垃圾收集,则可以存储
    WeakReference
    的实例,而不是对
    WorkspaceListener
    的强引用。(这意味着只要侦听器实例还活着,对每个侦听器的强引用就需要存储在其他地方。)
  • 或者,根本不要将
    WorkspaceListener
    存储在
    ProjectControllerImpl
    中,而是在实际需要时通过
    lookupAll()
    获取它们
github中的代码:
ProjectController pc = Lookup.getDefault().lookup(ProjectController.class);