2

Java 程序使用比 C++ 程序更多的内存似乎是一个既定事实。根据StackExchange 上的回答,这是由于垃圾收集的性质和 Java 的“二进制文件”的字节码性质。但是反射在这种情况下起什么作用呢?

在 Java 中,可以以纯文本的形式枚举和调用类的变量和方法,这些是在运行时提供的。为此,有一些存储的元数据将这些字符串键与其各自的属性链接起来。

这个元数据是否存储在堆上,如果是,有没有办法为我不需要反射的类禁用它?(普通旧数据)

4

1 回答 1

2

java 的工作方式是将所有类加载到称为 permgen 的内存区域中。无论您是否通过反射使用它,任何可用的类都会加载到 permgen 区域中。

使用反射

Class.forName("MyClass").newInstance() 

没有反射

new MyClass()

上述两个语句都要求在 permgen 中加载类

这个元数据是否存储在堆上,如果是,有没有办法为我不需要反射的类禁用它?(普通旧数据)

而且没有办法禁用它。

但最接近您可以获得的是实现自定义类加载器来加载类。当您完成使用由自定义类加载器加载的特定类时,您可以释放对该类的所有引用并卸载它。我希望它有所帮助。:)

于 2014-05-02T20:50:39.507 回答