Skip to content

[Bug] Memory leaking when disposing Diff editor #4659

Open
microsoft/vscode
#230713
@samirzubi-db

Description

@samirzubi-db

Reproducible in vscode.dev or in VS Code Desktop?

  • Not reproducible in vscode.dev or VS Code Desktop

Reproducible in the monaco editor playground?

  • Not reproducible in the monaco editor playground

Monaco Editor Playground Link

No response

Monaco Editor Playground Code

No response

Reproduction Steps

I wrote a small application demonstrating the issue:
You can find it on the following link: https://zd9n67.csb.app/
Code: https://codesandbox.io/p/sandbox/react-typescript-forked-zd9n67

Actual (Problematic) Behavior

Diff editor does not dispose correctly after being removed from the dom.
The regular editor component does not have this issue.

Initial load
initial_render

Second memory snapshot
second_take

Third memory snapshot
third_take

Fourth memory snapshot
fourth_take

The memory constantly grows as the diff editor is not properly disposed of. Form my investigation I could see that the Emitter and InteractionEmitter are constantly growing without being disposed in the monaco-editor/esm/vs/editor/browser/widget/codeEditor/codeEditorWidget.js file.
Also a lot of detached canvas dom elements like:
<canvas class="original diffOverviewRuler" ...

Expected Behavior

Diff editor gets removed properly and does not cause a memory leak.

Additional Context

We started observing the issue in the 0.44.0 version of monaco-editor as the earlier versions don't seem to have this problem. The example is for the latest version 0.51.0

Activity

alexanderwu-db

alexanderwu-db commented on Aug 27, 2024

@alexanderwu-db

Probably would be a good idea to write a unit test in the monaco editor library to test against memory leaks in the future?

samirzubi-db

samirzubi-db commented on Oct 7, 2024

@samirzubi-db
Author

I've submitted a fix in the vscode repo in case anyone needs to fix this in their codebase.

O10J

O10J commented on May 30, 2025

@O10J

I'm not sure if this is directly related to a bug, but I encountered a strange behavior when switching from a DiffEditor to a regular Editor.
After disposing a DiffEditor and then creating a regular Editor, the arrow keys (← →) start moving the cursor two characters instead of one.

Here's a minimal example to reproduce the issue. Please try it in the Monaco Playground:

let editor = null;
let diffEditor = null;

function disposeEditors() {
    monaco.editor.getEditors().forEach(e => e.dispose());
    monaco.editor.getModels().forEach(m => m.dispose()); 
    editor = null;
    diffEditor = null;
}

function initializeEditor(content = "") {
    require(['vs/editor/editor.main'], function () {
		disposeEditors();
        const container = document.getElementById('container');
        container.innerHTML = ""; 
        editor = monaco.editor.create(container, {
            value: content,
        });
    });
}

function initializeDiffEditor(originalContent, modifiedContent) {
    require(['vs/editor/editor.main'], function () {
		disposeEditors();
        const container = document.getElementById('container');
        container.innerHTML = ""; 
        diffEditor = monaco.editor.createDiffEditor(container, {
        });
        const originalModel = monaco.editor.createModel(originalContent, 'plaintext');
        const modifiedModel = monaco.editor.createModel(modifiedContent, 'plaintext');
        diffEditor.setModel({ original: originalModel, modified: modifiedModel });
    });
}

initializeEditor("AABBAABB");
initializeDiffEditor("AAAA", "BBBB")
initializeEditor("AABBAABB");
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      Participants

      @alexanderwu-db@samirzubi-db@O10J

      Issue actions

        [Bug] Memory leaking when disposing Diff editor · Issue #4659 · microsoft/monaco-editor