Java 如何杀死org.openide.util.Lookup中的对象
我使用gephi来绘制社交图。但是,它使用singleton来创建类ProjectControllerJava 如何杀死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 }; /
@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()
ProjectController pc = Lookup.getDefault().lookup(ProjectController.class);