From 27c093e2dae2bd64aad3de95d80f9c10e90dfcd3 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Mon, 13 Oct 2014 19:12:08 +0400 Subject: [PATCH] IDEA-131188 IDEA becomes very slow to respond - fixed VirtualMachine leaks --- .../quick/common/DebuggerTreeWithHistoryContainer.java | 10 +++++++++- .../quick/common/DebuggerTreeWithHistoryPanel.java | 10 ++++++++-- .../quick/common/DebuggerTreeWithHistoryPopup.java | 6 +----- .../xdebugger/impl/ui/tree/XInspectDialog.java | 2 +- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryContainer.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryContainer.java index 2851c701ef70..783c5c093092 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryContainer.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryContainer.java @@ -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 { } } } + + protected static void registerTreeDisposable(Disposable disposable, Tree tree) { + if (tree instanceof Disposable) { + Disposer.register(disposable, (Disposable)tree); + } + } } diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryPanel.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryPanel.java index 379bc82e6cff..f7c990e8a7a1 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryPanel.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryPanel.java @@ -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 extends DebuggerTreeWithHistoryContainer { private final JPanel myMainPanel; + private final Disposable myDisposable; - public DebuggerTreeWithHistoryPanel(@NotNull D initialItem, @NotNull DebuggerTreeCreator creator, @NotNull Project project) { + public DebuggerTreeWithHistoryPanel(@NotNull D initialItem, @NotNull DebuggerTreeCreator 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)); diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryPopup.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryPopup.java index 97edec9133ba..cbeb29d18404 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryPopup.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/evaluate/quick/common/DebuggerTreeWithHistoryPopup.java @@ -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 extends DebuggerTreeWithHistoryContainer initialItem = Pair.create(value, name); XDebuggerTreeCreator creator = new XDebuggerTreeCreator(project, editorsProvider, sourcePosition, markers); - myDebuggerTreePanel = new DebuggerTreeWithHistoryPanel>(initialItem, creator, project); + myDebuggerTreePanel = new DebuggerTreeWithHistoryPanel>(initialItem, creator, project, myDisposable); init(); }