我使用gephi绘制社交图。但是,它使用单例创建类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);


您可以在该类中看到它的列表。当您从此单例创建对象时,它将添加该列表。它使内存泄漏,我想在org.openide.util.Lookup中杀死该对象,我该怎么办?

最佳答案

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

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


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

07-28 12:13