From 344a1ec47e9c46f56ee24ca09b384de7043e2a55 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Thu, 18 May 2017 18:36:13 +0300 Subject: [PATCH] fixed memory leak from ThreadsDebuggerTree$1 --- .../debugger/ui/impl/DebuggerTreeBase.java | 5 ++--- .../debugger/ui/impl/DebuggerTreePanel.java | 8 +++++++ .../debugger/ui/impl/watch/DebuggerTree.java | 22 ++++--------------- .../ui/impl/watch/NodeManagerImpl.java | 6 +---- 4 files changed, 15 insertions(+), 26 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/DebuggerTreeBase.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/DebuggerTreeBase.java index de32f649ed2b..1b65eef33f88 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/DebuggerTreeBase.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/DebuggerTreeBase.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2015 JetBrains s.r.o. + * Copyright 2000-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -167,8 +167,6 @@ public class DebuggerTreeBase extends DnDAwareTree implements Disposable { return myCurrentTooltip; } - myCurrentTooltipNode = node; - final String toolTipText = getTipText(node); if (toolTipText == null) { return null; @@ -229,6 +227,7 @@ public class DebuggerTreeBase extends DnDAwareTree implements Disposable { toolTip.setPreferredSize(tipRectangle.getSize()); myCurrentTooltip = toolTip; + myCurrentTooltipNode = node; return myCurrentTooltip; } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/DebuggerTreePanel.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/DebuggerTreePanel.java index 6578093b729d..364e18861b96 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/DebuggerTreePanel.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/DebuggerTreePanel.java @@ -90,6 +90,14 @@ public abstract class DebuggerTreePanel extends UpdatableDebuggerView implements protected abstract DebuggerTree createTreeView(); + @Override + protected void changeEvent(DebuggerContextImpl newContext, DebuggerSession.Event event) { + super.changeEvent(newContext, event); + if (event == DebuggerSession.Event.DISPOSE) { + getTree().getNodeFactory().dispose(); + } + } + @Override protected void rebuild(DebuggerSession.Event event) { myRebuildAlarm.cancelAndRequest(); diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/DebuggerTree.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/DebuggerTree.java index 5269575cf9b0..4114fc9b8ffe 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/DebuggerTree.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/DebuggerTree.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2016 JetBrains s.r.o. + * Copyright 2000-2017 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,7 +31,6 @@ import com.intellij.debugger.engine.events.DebuggerCommandImpl; import com.intellij.debugger.engine.events.DebuggerContextCommandImpl; import com.intellij.debugger.engine.events.SuspendContextCommandImpl; import com.intellij.debugger.impl.DebuggerContextImpl; -import com.intellij.debugger.impl.DebuggerSession; import com.intellij.debugger.impl.DebuggerUtilsEx; import com.intellij.debugger.jdi.LocalVariableProxyImpl; import com.intellij.debugger.jdi.StackFrameProxyImpl; @@ -71,7 +70,9 @@ import javax.swing.event.TreeModelListener; import javax.swing.tree.TreePath; import java.awt.*; import java.awt.event.MouseEvent; -import java.util.*; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.LinkedList; import java.util.List; public abstract class DebuggerTree extends DebuggerTreeBase implements DataProvider { @@ -328,21 +329,6 @@ public abstract class DebuggerTree extends DebuggerTreeBase implements DataProvi protected abstract void build(DebuggerContextImpl context); - protected final void buildWhenPaused(DebuggerContextImpl context, RefreshDebuggerTreeCommand command) { - DebuggerSession session = context.getDebuggerSession(); - - if (ApplicationManager.getApplication().isUnitTestMode() || (session != null && session.getState() == DebuggerSession.State.PAUSED)) { - showMessage(MessageDescriptor.EVALUATING); - context.getDebugProcess().getManagerThread().schedule(command); - } - else { - showMessage(session != null? session.getStateDescription() : DebuggerBundle.message("status.debug.stopped")); - if (session == null || session.isStopped()) { - getNodeFactory().clearHistory(); // save memory by clearing references on JDI objects - } - } - } - public void rebuild(final DebuggerContextImpl context) { ApplicationManager.getApplication().assertIsDispatchThread(); final DebugProcessImpl process = context.getDebugProcess(); diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/NodeManagerImpl.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/NodeManagerImpl.java index d8cebff5d69a..44350497219e 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/NodeManagerImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/NodeManagerImpl.java @@ -139,12 +139,8 @@ public class NodeManagerImpl extends NodeDescriptorFactoryImpl implements NodeMa } public void dispose() { - clearHistory(); - super.dispose(); - } - - public void clearHistory() { myHistories.clear(); + super.dispose(); } private DebuggerTree getTree() {