Starting with 2020.1 release, the ability to install, update and uninstall plugins without restarting the IDE is available in the IntelliJ Platform. During plugin development, Auto-Reload also allows code changes to take effect immediately in the sandbox IDE instance.
For a plugin to support this, all restrictions listed below must be met. To verify a plugin locally, run Plugin DevKit | Plugin descriptor | Plugin.xml dynamic plugin verification
inspection on all plugin descriptor files (required
plugin.xml as well as any additional files).
No Components must be used; existing ones must be migrated to services, extensions or listeners.
<group>s must declare a unique
All extensions, whether defined in the platform itself or coming from other plugins, must be marked as dynamic (see next paragraph).
Some deprecated extension points (e.g.,
com.intellij.configurationProducer) are intentionally non-dynamic, and their usage should be migrated to the corresponding replacement.
All extension points provided by the plugin must adhere to specific usage rules and then be declared ready for dynamic use explicitly.
Configurable which depends on dynamic extension points must implement
Application, project and module services declared with
overrides="true" are not allowed.
Loading/Unloading a plugin clears all cached values created using
Do not store references to PSI elements in objects which can survive plugin loading or unloading, use
This can be used to e.g. cancel long-running activities or disallow unload due to ongoing processes.
When a plugin is being uninstalled or updated, the IDE waits synchronously for plugin unload and asks for restart if the unload failed.
All events are tracked under
com.intellij.ide.plugins.DynamicPlugins category in IDE log file.
To find leaks preventing clean unload, perform the following steps:
- Set registry key
- Verify that IDE runs with VM parameter
- Open the
.hprofsnapshot generated on plugin unload, look for the plugin ID string
- Find the
PluginClassLoaderreferencing the plugin ID string
- Look at references to the
PluginClassLoaderinstance. Every one of them is a memory leak (or part of a memory leak) that needs to be resolved.