Skip to content

Commit

Permalink
#412 memory leak fix, disposing
Browse files Browse the repository at this point in the history
  • Loading branch information
krasa committed Feb 1, 2024
1 parent 9e42b0d commit ceb4c8b
Show file tree
Hide file tree
Showing 10 changed files with 63 additions and 29 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

## [Unreleased]

- Memory leak fix

## [7.5.0-IJ2023.2] - 2024-01-31
- IntelliJ 2024.1 compatibility

Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ pluginName=plantuml4idea
pluginRepositoryUrl=https://github.com/esteinberg/plantuml4idea

# SemVer format -> https://semver.org
pluginVersion=7.5.1-IJ2023.2
pluginVersion=7.6.0-IJ2023.2

# Supported build number ranges and IntelliJ Platform versions -> https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html
pluginSinceBuild=232.6734.9
Expand Down
32 changes: 19 additions & 13 deletions src/main/java/org/plantuml/idea/preview/PlantUmlPreviewPanel.java
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ public class PlantUmlPreviewPanel extends JPanel implements Disposable {
private final PlantUmlSettings settings;
private RenderCacheItem displayedItem;

public PlantUmlPreviewPanel(@NotNull Project project, PlantUmlPreviewEditor fileEditor, @Nullable JComponent parent) {
public PlantUmlPreviewPanel(@NotNull Project project, @Nullable PlantUmlPreviewEditor fileEditor, @Nullable JComponent parent) {
super(new BorderLayout());
this.project = project;
this.fileEditor = fileEditor;
Expand Down Expand Up @@ -213,6 +213,9 @@ public void mouseMoved(MouseEvent e) {
public void dispose() {
logger.debug("dispose");
removeAllImages();
if (displayedItem != null) {
displayedItem.dispose(this);
}
}

private Alarm myAlarm = new Alarm(Alarm.ThreadToUse.SWING_THREAD);
Expand Down Expand Up @@ -443,26 +446,29 @@ public void run() {
}
}

private boolean displayImages(RenderCacheItem cacheItem, boolean force) {
if (!force && renderCache.isOlderRequest(cacheItem, displayedItem)) { //ctrl+z with cached image vs older request in progress
logger.debug("skipping displaying older result", cacheItem);
private boolean displayImages(RenderCacheItem newItem, boolean force) {
if (!force && renderCache.isOlderRequest(newItem, displayedItem)) { //ctrl+z with cached image vs older request in progress
logger.debug("skipping displaying older result", newItem);
return false;
}
long start = System.currentTimeMillis();

//maybe track position per file?
RenderCacheItem displayedItem = this.displayedItem;
boolean restoreScrollPosition = displayedItem != null && displayedItem.getRenderResult().hasError() && renderCache.isSameFile(cacheItem, displayedItem);
boolean restoreScrollPosition = displayedItem != null && displayedItem.getRenderResult().hasError() && renderCache.isSameFile(newItem, displayedItem);
//must be before revalidate
int lastValidVerticalScrollValue = this.lastValidVerticalScrollValue;
int lastValidHorizontalScrollValue = this.lastValidHorizontalScrollValue;

if (displayedItem != null) {
displayedItem.dispose(this);
}

this.displayedItem = cacheItem;
this.displayedItem = newItem;

ImageItem[] imageItems = cacheItem.getImageItems();
RenderResult renderResult = cacheItem.getRenderResult();
int requestedPage = cacheItem.getRequestedPage();
ImageItem[] imageItems = newItem.getImageItems();
RenderResult renderResult = newItem.getRenderResult();
int requestedPage = newItem.getRequestedPage();

if (requestedPage >= renderResult.getPages()) {
logger.debug("requestedPage >= renderResult.getPages()", requestedPage, ">=", renderResult.getPages());
Expand All @@ -474,7 +480,7 @@ private boolean displayImages(RenderCacheItem cacheItem, boolean force) {
}

if (requestedPage == -1) {
boolean incrementalDisplay = cacheItem.getRenderRequest().getReason() != RenderCommand.Reason.REFRESH && renderCache.isSameFile(cacheItem, displayedItem);
boolean incrementalDisplay = newItem.getRenderRequest().getReason() != RenderCommand.Reason.REFRESH && renderCache.isSameFile(newItem, displayedItem);
logger.debug("displaying images ", requestedPage, ", incrementalDisplay=", incrementalDisplay);

Component[] children = imagesPanel.getComponents();
Expand All @@ -493,19 +499,19 @@ private boolean displayImages(RenderCacheItem cacheItem, boolean force) {
} else {
imagesPanel.remove(i * 2);
}
JComponent component = createImageContainer(cacheItem, i, imageItem);
JComponent component = createImageContainer(newItem, i, imageItem);
imagesPanel.add(component, i * 2);
}
} else {
removeAllImages();
for (int i = 0; i < imageItems.length; i++) {
displayImage(cacheItem, i, imageItems[i]);
displayImage(newItem, i, imageItems[i]);
}
}
} else {
logger.debug("displaying image ", requestedPage);
removeAllImages();
displayImage(cacheItem, requestedPage, imageItems[requestedPage]);
displayImage(newItem, requestedPage, imageItems[requestedPage]);
}

if (settings.isHighlightInImages()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,15 @@ public class ImageContainerPng extends JLabel implements ImageContainer {
Separator.getInstance(),
new CopyPlantUmlServerLinkContextAction()
};
private static final ActionPopupMenu ACTION_POPUP_MENU = ActionManager.getInstance().createActionPopupMenu("plantuml4idea-ImageContainerPng", new ActionGroup() {

public static final ActionGroup ACTION_GROUP = new ActionGroup() {

@NotNull
@Override
public AnAction[] getChildren(@Nullable AnActionEvent e) {
return AN_ACTIONS;
}
});
};

private static Logger LOG = Logger.getInstance(ImageContainerPng.class);
private Project project;
Expand Down Expand Up @@ -120,7 +121,7 @@ private void setDiagram(JPanel parent, @NotNull final ImageItem imageItem, Rende

@Override
public void invokePopup(Component comp, int x, int y) {
ACTION_POPUP_MENU.getComponent().show(comp, x, y);
ActionManager.getInstance().createActionPopupMenu("plantuml4idea-ImageContainerPng", ACTION_GROUP).getComponent().show(comp, x, y);
}
});

Expand Down Expand Up @@ -202,6 +203,6 @@ Object getData(@NotNull @NonNls String s) {

@Override
public void dispose() {

originalImage = null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -56,14 +56,14 @@ public class ImageContainerSvg extends JPanel implements ImageContainer {
Separator.getInstance(),
new CopyPlantUmlServerLinkContextAction(),
};
public static final ActionPopupMenu ACTION_POPUP_MENU = ActionManager.getInstance().createActionPopupMenu("plantuml4idea-ImageContainerSvg", new ActionGroup() {
public static final ActionGroup ACTION_GROUP = new ActionGroup() {

@NotNull
@Override
public AnAction[] getChildren(@Nullable AnActionEvent e) {
return AN_ACTIONS;
}
});
};

private static Logger LOG = Logger.getInstance(ImageContainerSvg.class);
private final Alarm zoomAlarm;
Expand Down Expand Up @@ -175,7 +175,7 @@ public void propertyChange(PropertyChangeEvent propertyChangeEvent) {
contentComponent.addMouseListener(new PopupHandler() {
@Override
public void invokePopup(Component comp, int x, int y) {
ACTION_POPUP_MENU.getComponent().show(comp, x, y);
ActionManager.getInstance().createActionPopupMenu("plantuml4idea-ImageContainerSvg", ACTION_GROUP).getComponent().show(comp, x, y);
}
});

Expand Down Expand Up @@ -293,6 +293,8 @@ Object getData(@NotNull @NonNls String s) {

@Override
public void dispose() {

if (editor != null) {
editor.dispose();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.ui.scale.ScaleContext;
import com.intellij.ui.scale.ScaleType;
Expand Down Expand Up @@ -54,7 +55,6 @@ public final class MyImageEditorImpl implements MyImageEditor {
private final Project project;
private final VirtualFile file;
private final MyImageEditorUI editorUI;
private boolean disposed;

// public MyImageEditorImpl(@NotNull Project project, @NotNull VirtualFile file) {
// this(project, file, false);
Expand Down Expand Up @@ -181,6 +181,10 @@ public ImageZoomModel getZoomModel() {
return editorUI.getZoomModel();
}

public void dispose() {
Disposer.dispose(editorUI);
}


public class MyScaledImageProvider implements ImageDocument.ScaledImageProvider {

Expand Down Expand Up @@ -278,6 +282,10 @@ private void logDocument(Document svgDocument) {
}
}
}

public void dispose() {
holder = new Holder();
}
}

static class Holder {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -235,8 +235,8 @@ public ImageComponent getImageComponent() {
public void dispose() {
// imageComponent.removeMouseWheelListener(wheelAdapter);
// imageComponent.getDocument().removeChangeListener(changeListener);

removeAll();
imageProvider.dispose();
}

@Override
Expand Down
11 changes: 6 additions & 5 deletions src/main/java/org/plantuml/idea/rendering/ImageItem.java
Original file line number Diff line number Diff line change
Expand Up @@ -234,11 +234,12 @@ private synchronized ImageItemComponent getImageItemComponent(PlantUmlPreviewPan
/**
* items are shared between RenderCacheItem
*/
@Deprecated
public void dispose() {
// if (editor != null) {
// Disposer.dispose(editor);
// }
public void dispose(PlantUmlPreviewPanel plantUmlPreviewPanel) {
ImageItemComponent remove = componentMap.remove(plantUmlPreviewPanel);
if (remove != null) {
remove.dispose(); //todo not necessary?
}
bufferedImage = null;
}

public class LinkData {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,11 @@ public void setEditor(MyImageEditorImpl editor) {
boolean isNull() {
return editor == null && image == null;
}

public void dispose() {
image = null;
if (editor != null) {
editor.dispose();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.plantuml.idea.preview.PlantUmlPreviewPanel;
import org.plantuml.idea.preview.Zoom;

import java.io.File;
Expand Down Expand Up @@ -236,4 +237,10 @@ public boolean hasImagesOrStacktrace() {
}
return false;
}

public void dispose(PlantUmlPreviewPanel plantUmlPreviewPanel) {
for (ImageItem imageItem : imageItems) {
imageItem.dispose(plantUmlPreviewPanel);
}
}
}

0 comments on commit ceb4c8b

Please sign in to comment.