IDEA-131188 IDEA becomes very slow to respond - fixed VirtualMachine leaks

This commit is contained in:
Egor.Ushakov
2014-10-13 19:14:11 +04:00
parent 8f1514a2ab
commit 27c093e2da
4 changed files with 19 additions and 9 deletions
@@ -18,10 +18,12 @@ package com.intellij.xdebugger.impl.evaluate.quick.common;
import com.intellij.codeInsight.CodeInsightBundle;
import com.intellij.concurrency.ResultConsumer;
import com.intellij.icons.AllIcons;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Disposer;
import com.intellij.ui.ScrollPaneFactory;
import com.intellij.ui.treeStructure.Tree;
import com.intellij.xdebugger.XDebuggerBundle;
@@ -32,7 +34,7 @@ import javax.swing.tree.TreePath;
import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.util.*;
import java.util.ArrayList;
import java.util.List;
/**
@@ -177,4 +179,10 @@ abstract class DebuggerTreeWithHistoryContainer<D> {
}
}
}
protected static void registerTreeDisposable(Disposable disposable, Tree tree) {
if (tree instanceof Disposable) {
Disposer.register(disposable, (Disposable)tree);
}
}
}
@@ -15,6 +15,7 @@
*/
package com.intellij.xdebugger.impl.evaluate.quick.common;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.project.Project;
import com.intellij.ui.ScrollPaneFactory;
import com.intellij.ui.treeStructure.Tree;
@@ -28,14 +29,19 @@ import java.awt.*;
*/
public class DebuggerTreeWithHistoryPanel<D> extends DebuggerTreeWithHistoryContainer<D> {
private final JPanel myMainPanel;
private final Disposable myDisposable;
public DebuggerTreeWithHistoryPanel(@NotNull D initialItem, @NotNull DebuggerTreeCreator<D> creator, @NotNull Project project) {
public DebuggerTreeWithHistoryPanel(@NotNull D initialItem, @NotNull DebuggerTreeCreator<D> creator, @NotNull Project project, Disposable disposable) {
super(initialItem, creator, project);
myMainPanel = createMainPanel(myTreeCreator.createTree(initialItem));
myDisposable = disposable;
Tree tree = myTreeCreator.createTree(initialItem);
registerTreeDisposable(myDisposable, tree);
myMainPanel = createMainPanel(tree);
}
@Override
protected void updateContainer(Tree tree, String title) {
registerTreeDisposable(myDisposable, tree);
Component component = ((BorderLayout)myMainPanel.getLayout()).getLayoutComponent(BorderLayout.CENTER);
myMainPanel.remove(component);
myMainPanel.add(BorderLayout.CENTER, ScrollPaneFactory.createScrollPane(tree));
@@ -15,13 +15,11 @@
*/
package com.intellij.xdebugger.impl.evaluate.quick.common;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.popup.JBPopup;
import com.intellij.openapi.ui.popup.JBPopupFactory;
import com.intellij.openapi.util.Computable;
import com.intellij.openapi.util.Disposer;
import com.intellij.ui.ScreenUtil;
import com.intellij.ui.awt.RelativePoint;
import com.intellij.ui.treeStructure.Tree;
@@ -93,9 +91,7 @@ class DebuggerTreeWithHistoryPopup<D> extends DebuggerTreeWithHistoryContainer<D
})
.createPopup();
if (tree instanceof Disposable) {
Disposer.register(myPopup, (Disposable)tree);
}
registerTreeDisposable(myPopup, tree);
//Editor may be disposed before later invokator process this action
if (myEditor.getComponent().getRootPane() == null) {
@@ -50,7 +50,7 @@ public class XInspectDialog extends DialogWrapper {
Pair<XValue, String> initialItem = Pair.create(value, name);
XDebuggerTreeCreator creator = new XDebuggerTreeCreator(project, editorsProvider, sourcePosition, markers);
myDebuggerTreePanel = new DebuggerTreeWithHistoryPanel<Pair<XValue, String>>(initialItem, creator, project);
myDebuggerTreePanel = new DebuggerTreeWithHistoryPanel<Pair<XValue, String>>(initialItem, creator, project, myDisposable);
init();
}