The unfortunate reality is that once you have sufficiently interconnected modules, it is almost impossible to prove that all references to modules that you wish to unload will be removed in any circumstance. Many libraries and even core JDK classes will hold references to objects or classes for long periods of time, or even forever, and even a single stray reference will prevent the
ClassLoader that loaded a module from being garbage collected.
Such problems are very tedious to solve, hard to detect automatically, and are very easy to reintroduce.
This problem rears its ugly head also with redeployment of
WARs in servlet containers such as Jetty or Tomcat.
Many developers choose a more pragmatic route and spend time developing new features and fixing bugs rather than ensuring that hot loading and unloading of code works 100% correctly. So Eclipse recommends that you restart whenever you reconfigure its plugins, since it cannot guarantee that all plugins that you download will hot load or unload correctly.