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

标签 reflection jvm classloader

在使用 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/

相关文章:

.net - 使用多线程加速 .NET 反射

c# - 获取 PropertyInfo 的值

c# - C# 通用属性限制的解决方法

java - 如果安装新版本的 JDK,运行 Java 进程会发生什么情况?

java - 与 32 位 tomcat 相比,使用 64 位 tomcat 是否可以提高性能?

c# - 在给定 Collection<T> 对象的情况下查找 "T"

clojure - REPL 和 jar 中的 Tika 解析器行为不同

java - 从实现公共(public)接口(interface)的 jar 中实例化类,然后将实例分配给该接口(interface)会导致 ClassCastException

Java类加载

java - 如何从其他 JAR 文件加载资源