是的,你可以编译/加载一个类代码的类加载器,调用它没有问题。
是的,动态代码将达到“完整性能”。没有区别。但是,新加载的代码将以解释模式启动,并且需要在编译之前预热。
然而,第3点非常棘手。
- '泄漏'丢弃类加载器非常容易/可能。类加载器保持对它的加载类的引用。每个类都有一个对它的类加载器的引用。每个对象都引用它的类。因此,只要您引用了一个对象或类,该对象或类加载了抛弃类加载器,它和它的加载类就会保持活动状态。
因为很容易引用一个对象,所以'classloader'泄漏很常见。
- 它取决于GC配置和JVM版本它实际上是GC在加载的类上传递。您可能需要额外的标志才能启用它。与CMS GC' -XX类似:+ CMSClassUnloadingEnabled'。
- 有一个代码缓存(在OpenJDK / Hotspot中),它保存已编译的代码。如果您在应用程序的所有生命周期内继续加载代码,则可能会超出此缓存。在较旧的JVM中,它刚刚填满,一旦完成,它就会停止编译代码,降低性能,除非你启用了刷新缓存(-XX:+ UseCodeCacheFlushing)。 Afaik在较新版本中默认刷新。仔细检查一下。您可能希望密切关注代码缓存。 (例如通过JMX)