Sun JVM在运行时创建sun.reflect.DelegatingClassLoader的实例是什么?

Eug*_*gen 17 reflection jvm classloader

在使用jhat分析堆转储的同时,我观察到了许多DelegatingClassLoader实例,虽然它们没有在代码中显式调用.我希望这是一种反射优化机制.有人知道细节吗?

Nat*_*Nat 17

是的,它可能是反射优化.

在Sun JVM上,最初通过将JNI调用到JVM实现中来执行对属性和方法的反射访问.如果JVM注意到反射大量访问方法或字段,它将生成字节码以执行相同的操作 - 它称之为"通胀"的机制.这有一个初始速度命中,但在此之后运行速度快20倍.如果你做了很多反思,这是一个很大的胜利.

该字节码存在于DelegatingClassLoader实例创建的类中.密切关注它:这些类可以对permgen空间施加压力并导致可怕的"java.lang.OutOfMemoryError:PermGen space"失败.如果这是一个问题,您可以通过将系统属性sun.reflect.inflationThreshold设置为0(零)来关闭通胀.