在使用 jhat 分析堆转储时,我观察到创建了许多 DelegatingClassLoader 实例,尽管它们没有在代码中显式调用。我希望这是某种反射优化机制。有人知道细节吗?
最佳答案
是的,这可能是反射优化。
在 Sun JVM 上,对属性和方法的反射访问最初是通过 JNI 调用到 JVM 实现中来执行的。如果 JVM 注意到一个方法或字段被反射访问了很多,它会生成字节码来做同样的事情——它称为“膨胀”的机制。这有一个初始速度命中,但之后运行速度大约快 20 倍。如果您进行大量反射(reflection),将是一个巨大的胜利。
该字节码存在于由 DelegatingClassLoader 实例创建的类中。请密切注意:这些类可能会对 permgen 空间施加压力,并导致可怕的“java.lang.OutOfMemoryError: PermGen space”失败。如果这是一个问题,您可以通过将系统属性 sun.reflect.inflationThreshold 设置为 0(零)来关闭通货膨胀。
关于reflection - Sun JVM 在运行时创建 sun.reflect.DelegatingClassLoader 的实例是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6505274/