This document lists all plugin classes to search for when analyzing heap dumps to identify memory leaks after plugin unload. All classes should have count = 0 after successful plugin unload.
Classes are organized by module: backend, frontend, and shared.
Expected: 1 instance per project, or 0 after unload
service.ViewServiceservice.ToolWindowServiceservice.ToolWindowServiceInterface(interface)service.StatusBarServiceservice.GitServiceservice.TargetBranchServiceimplementation.compare.ChangesService
state.Statestate.MyModelConverterstate.WindowPositionTracker
Expected: 0 after unload
listener.MyBulkFileListenerlistener.MyDynamicPluginListenerlistener.MyToolWindowListenerlistener.VcsStartuplistener.MyChangeListListenerlistener.MyGitRepositoryChangeListenerlistener.MyFileEditorManagerListenerlistener.MyTabContentListenerlistener.MyTreeSelectionListenerlistener.ToggleHeadActionlistener.VcsContextMenuAction
toolwindow.ToolWindowViewtoolwindow.ToolWindowUIFactorytoolwindow.BranchSelectViewtoolwindow.TabOperationstoolwindow.VcsTreeActions
toolwindow.actions.TabMoveActionstoolwindow.actions.TabMoveActions$MoveTabLefttoolwindow.actions.TabMoveActions$MoveTabRighttoolwindow.actions.RenameTabActiontoolwindow.actions.ResetTabNameAction
toolwindow.elements.VcsTreetoolwindow.elements.BranchTreetoolwindow.elements.BranchTreeEntrytoolwindow.elements.MySimpleChangesBrowsertoolwindow.elements.CurrentBranchtoolwindow.elements.TargetBranch
statusBar.MyStatusBarWidgetstatusBar.MyStatusBarWidgetFactorystatusBar.MyStatusBarPanel
model.MyModelmodel.MyModel$field(enum)model.MyModelBasemodel.TargetBranchMapmodel.Debounce
implementation.lineStatusTracker.MyLineStatusTrackerImpl
implementation.scope.MyScopeimplementation.scope.MyPackageSet(registered with NamedScopeManager - critical leak if not unregistered)implementation.scope.MyScopeInTargetimplementation.scope.MyScopeNameSupplier
implementation.fileStatus.GitScopeFileStatusProvider
settings.GitScopeSettingsComponentsettings.GitScopeSettingsConfigurable
rpc.BackendGutterRpcImplrpc.BackendGutterRpcProvider
utils.CustomRollbackutils.GitUtilutils.PlatformApiReflection
gitscope.frontend.GutterRenderingServicegitscope.frontend.GutterRenderingStartup
implementation.gutter.LineStatusGutterMarkerRendererimplementation.gutter.ScopeLineStatusMarkerRendererimplementation.gutter.ScopeDiffViewerimplementation.gutter.ScopeGutterHighlighterManagerimplementation.gutter.ScopeGutterPopupPanel
rpc.FrontendGutterSubscriptionsrpc.FrontendGutterSubscriptionsStartup
service.GutterDataServiceservice.GutterDataService$GutterFileDataservice.GutterDataService$Listener(interface)
implementation.gutter.Rangeimplementation.gutter.RangesBuilder
rpc.GutterRpcApirpc.GutterUpdateEventrpc.GutterUpdateEvent$DataUpdatedrpc.GutterUpdateEvent$DataClearedrpc.GutterUpdateEvent$AllClearedrpc.GutterFileDataDtorpc.GutterRangeDto
settings.GitScopeSettings
system.Defs
utils.SharedReflectionutils.Notification
These are patterns - search for classes matching these names:
ToolWindowView$listener(Consumer<MyModel.field> stored as field)ViewService$modelListeners(HashMap of model → Consumer listeners)MyLineStatusTrackerImpl$$Lambda(lambdas from line status tracker)ScopeLineStatusMarkerRenderer$$Lambda(lambdas from gutter renderer)GutterRenderingService$$Lambda(lambdas from rendering service)BackendGutterRpcImpl$$Lambda(callbackFlow listener)MySimpleChangesBrowser$1(anonymous MouseAdapter)BranchTree$MyColoredTreeCellRenderer- Any class ending with
$$Lambda$...
Filter the HPROF classes view using these prefixes:
service.listener.toolwindow.implementation.model.state.statusBar.settings.utils.rpc.gitscope.frontend.system.
- Sort by "Count" column
- Look for
count != 0 - Focus on YOUR packages (ignore
com.intellij.*,java.*,kotlin.*)
Most likely to leak:
- All listeners - Must be unregistered
- ToolWindowView - UI components must be disposed, model listener removed
- ViewService - Model listeners must be removed in dispose()
- MyLineStatusTrackerImpl - Background tasks must be cancelled
- ScopeLineStatusMarkerRenderer - Highlighters and mouse listeners must be removed
- GutterRenderingService - Must remove itself from GutterDataService listeners
- BackendGutterRpcImpl - callbackFlow listener removed on awaitClose
- FrontendGutterSubscriptions - Coroutine scope cancelled on service dispose
- GutterDataService - Listener list and file data map cleared on dispose
- Any class with
$in the name - Anonymous/inner classes often capture outer references
- Open the
.hproffile in IntelliJ's memory profiler - Navigate to the "Classes" view
- Sort by "Count" column in descending order
- Search for each class using the package prefixes above
- Report back any classes with
count != 0and we'll fix them!