我使用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()
获取它们。