我使用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中的对象,如何我可以吗?
答案 0 :(得分:1)
您链接到的ProjectControllerImpl
类的代码还包含一个方法removeWorkspaceListener()
,您可以使用该方法在不再需要单个侦听器时取消注册(假设您了解这些侦听器并且他们知道这些侦听器)可以删除)。
当然,您可以使用自己的ProjectController
实现来以不同的方式处理侦听器:
WeakReference<WorkspaceListener>
实例阻止WorkspaceListener
被垃圾回收,则可以存储ProjectControllerImpl
的实例而不是WorkspaceListener
的强引用。 (这意味着只要侦听器实例应该存在,就需要将对每个侦听器的强引用存储在其他位置。)WorkspaceListener
存储在ProjectControllerImpl
中,而是在实际需要时通过lookupAll()
获取它们。